この大会は2017/3/18 9:00(JST)~2017/3/20 9:00(JST)に開催されました。
今回もチームで参戦。結果は120点で908チーム中179位でした。
自分で解けた問題をWriteupとして書いておきます。
Welcome (Misc)
IRCでfrreenodeの#0ctf2017に入ると、フラグを見ることができる。
09:02 *topic : Welcome to 0ctf 2017! https://ctf.0ops.net (flag{Welcome_to_0CTF_2017})
flag{Welcome_to_0CTF_2017}
integrity (Crypto)
AES暗号の問題で、ncで接続した際に"r"で指定した文字を暗号化、"l"で復号する。
その際、暗号化する文字列は32バイト以下で、"admin"を暗号化することはできない。
その状況で、復号して"admin"になる暗号文を指定することができれば、フラグが得られる。
暗号化の概要は以下の通り。
1) 指定した文字を16の倍数の文字長になるようパディング
2) 1)の文字列のMD5ダイジェストを1)の文字列の前につける。
3) 2)の文字列をランダムなIVでAES暗号化する。
4) 「IV + 3)の暗号化文字列」を16進数表記で返す。
このことから1ブロックずらして考え、目的の暗号データを取得できないか考える。
CBCモードなので、以下のようになる。
[平文1ブロック目] ^ IV --(暗号化)--> [暗号文1ブロック目]
[平文2ブロック目] ^ [暗号文1ブロック目] --(暗号化)--> [暗号文2ブロック目]
[平文3ブロック目] ^ [暗号文2ブロック目] --(暗号化)--> [暗号文3ブロック目]
平文のブロックを以下のようにする。
1ブロック目:2ブロック目+3ブロック目の文字列のMD5
2ブロック目:"admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"のMD5
3ブロック目:"admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
これで暗号化した結果から、復号する際に以下のように指定すれば、復号して"admin"になる。
IV = [暗号結果1ブロック目]
1ブロック目:[暗号結果2ブロック目]
2ブロック目:[暗号結果3ブロック目]
これをプログラムにする。
import socket from hashlib import md5 BS = 16 pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) uname = pad('admin') h_uname = md5(uname).digest() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('202.120.7.217', 8221)) data = s.recv(1024).strip('\n') print data data = s.recv(1024).strip('\n') print data s.sendall('r\n') print 'r' name = h_uname + uname s.sendall(name + '\n') print h_uname + uname data = s.recv(1024).strip('\n') print data data = s.recv(1024).strip('\n') print data enc = data.split('\n')[0] enc = enc[BS * 2:] s.sendall('l\n') print 'l' s.sendall(enc + '\n') print enc data = s.recv(1024).strip('\n') print data data = s.recv(1024).strip('\n') print data
実行結果は以下の通り。
Welcome to 0CTF encryption service! Please [r]egister or [l]ogin r !・キ・・フ└rEィ渋dmin Here is your secret: 06f03d4dbaf5e6e99a049ce5c213fa6b1f82eaf57d71bfb74195417e9cf4c0a91389f95efc7f82af6f7c1b2decdaf2bfae0118b0d03887586632ebc95fcb2194 Please [r]egister or [l]ogin l 1f82eaf57d71bfb74195417e9cf4c0a91389f95efc7f82af6f7c1b2decdaf2bfae0118b0d03887586632ebc95fcb2194 Welcome admin! flag{Easy_br0ken_scheme_cann0t_keep_y0ur_integrity}
flag{Easy_br0ken_scheme_cann0t_keep_y0ur_integrity}