WhiteHat Grand Prix 2017 Writeup

この大会は2017/12/16 11:00(JST)~2017/12/17 11:00(JST)に開催されました。
今回もチームで参戦。結果は411点で169チーム中30位でした。
自分で解けた問題をWriteupとして書いておきます。

Bonus (Misc 1)

slackで#whitehat_anouncementチャネルに入ると、フラグのお知らせがあった。

WhiteHat{bc0b6353ab20df0fb7bc7a89e57cdc3ace54cb1f}

Welcome (Misc 10)

動画を見てると最後の方で16進表記で記載されている文字列がある。
f:id:satou-y:20171224211517p:plain

>>> '5768697465'.decode('hex')
'White'
>>> '486174'.decode('hex')
'Hat'
>>> '7b57656c636f6d65'.decode('hex')
'{Welcome'
>>> '5f746f5f477261'.decode('hex')
'_to_Gra'
>>> '6e645f507269787d'.decode('hex')
'nd_Prix}'

結合すると、WhiteHat{Welcome_to_Grand_Prix} となる。

$ echo -n Welcome_to_Grand_Prix | sha1sum
e75e376bd57142ab77e1c47e0dc9470627deb68d  -
WhiteHat{e75e376bd57142ab77e1c47e0dc9470627deb68d}

Secure_token (Crypto 100)

以下のように暗号化される。

入力:メッセージ文字列の16進表記
msg = {"a": メッセージ文字列, "flag": keyのmd5}
cipher = msgのAES暗号の16進表記

平文は「{"a": 」という形式であると考え、ブロック暗号であることを利用してパディング文字数を調整しながら、先頭からフラグを探り当てる。以下のようなことを繰り返すイメージ。

{"a": "########<FLAG>
{"a": "########<FLAG1文字目をBFで回す>

{"a": "#######<FLAG>
{"a": "#######F<FLAG2文字目をBFで回す>

  :
import socket
import string

header = '{"a": "'
def query(s, text, cont):
    data = s.recv(1024)
    data = s.recv(1024)
    send_data = text.encode('hex')
    s.sendall(send_data + '\n')
    data = s.recv(1024)
    recv_data = data[12:].strip().decode('hex')
    data = s.recv(1024)
    s.sendall(cont + '\n')
    return recv_data

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('secure-token.grandprix.whitehatvn.com', 3333))

flag = ''
while True:
    padding = '#' * ((- len(header + flag) - 1) % 16)
    size = len(header + padding + flag) + 1
    correct = query(s, padding, 'y')[0:size]
    for c in string.printable:
        try_str = query(s, padding + flag + c, 'y')[0:size]
        if try_str == correct:
            flag += c
            print c,
            break

    if flag[-1:] == '}':
        query(s, 'fin', 'n')[0:size]
        break

print ''
print flag

実行結果は次の通りとなる。

" ,   " f l a g " :   " c 7 3 6 6 4 5 6 8 e 1 7 c d 0 e 3 d 5 b 0 8 4 d a 0 7 c 3 f 5 f " }
", "flag": "c73664568e17cd0e3d5b084da07c3f5f"}
$ echo -n c73664568e17cd0e3d5b084da07c3f5f | sha1sum
328fe20bc7c47d8a11c3c8810c0a9985e6262332  -
WhiteHat{328fe20bc7c47d8a11c3c8810c0a9985e6262332}