この大会は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進表記で記載されている文字列がある。
>>> '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}