この大会は2024/8/3 2:00(JST)~2024/8/5 2:00(JST)に開催されました。
今回もチームで参戦。結果は150点で575チーム中117位でした。
自分で解けた問題をWriteupとして書いておきます。
Welcome (Misc)
Discordに入り、#announcementsチャネルのメッセージを見ると、フラグが書いてあった。
crew{welcome_to_crew_ctf_2024}
Recursion (Forensics)
No.55のパケットが巨大で、gzデータが含まれていそうなので、Leftover Capture Dataをエクスポートする。解凍すると、layer4.pcapngが展開される。
今度はNo.58について、7zデータが含まれていそうなので、同様にエクスポートする。解凍すると、layer3.pcapngが展開される。
今度はNo.51について、tarデータが含まれていそうなので、同様にエクスポートする。解凍すると、layer2.pcapngが展開される。
今度はNo.67について、zipデータが含まれていそうなので、同様にエクスポートする。解凍すると、layer1.pcapngが展開される。
今度はNo.59について、pcapngデータが含まれていそうなので、同様にエクスポートする。最後の16バイトはゴミなので削除する。
最後にNo.67のパケットを見ると、フラグが見つかった。
crew{l00ks_l1ke_y0u_mad3_1t!}
4ES (Crypto)
暗号化処理の概要は以下の通り。
・chars = b'crew_AES*4=$!?' ・L = 3 ・w, x, y, z: charsから3つの文字を選択したバイト列 ・k1: wのsha256ダイジェスト ・k2: xのsha256ダイジェスト ・k3: yのsha256ダイジェスト ・k4: zのsha256ダイジェスト ・pt = b'AES_AES_AES_AES!' ・ct: ptをk1, k2, k3, k4の順でAES暗号化 ・key: w + x + y + zのsha256ダイジェスト ・enc_flag: FLAGをkeyでAES暗号化 ・pt, ct, enc_flagを16進数表記で出力
ブルートフォースでptをk1, k2で暗号化したものと、ctをk4, k3で復号したものが一致するものを探す。あとはkeyを割り出せるので、enc_flagを復号し、フラグを得る。
#!/usr/bin/env python3 from hashlib import sha256 from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import itertools chars = b'crew_AES*4=$!?' with open('output.txt', 'r') as f: params = f.read().splitlines() pt = bytes.fromhex(params[0].split(' ')[-1]) ct = bytes.fromhex(params[1].split(' ')[-1]) enc_flag = bytes.fromhex(params[2].split(' ')[-1]) cts = {} for c1 in itertools.product(chars, repeat=3): w = bytes(c1) k1 = sha256(w).digest() ct1 = AES.new(k1, AES.MODE_ECB).encrypt(pt) for c2 in itertools.product(chars, repeat=3): x = bytes(c2) k2 = sha256(x).digest() ct2 = AES.new(k2, AES.MODE_ECB).encrypt(ct1) cts[ct2] = (w, x) found = False for c4 in itertools.product(chars, repeat=3): z = bytes(c4) k4 = sha256(z).digest() ct3 = AES.new(k4, AES.MODE_ECB).decrypt(ct) for c3 in itertools.product(chars, repeat=3): y = bytes(c3) k3 = sha256(y).digest() ct2 = AES.new(k3, AES.MODE_ECB).decrypt(ct3) if ct2 in cts: found = True w = cts[ct2][0] x = cts[ct2][1] break if found: break print('[+] w =', w) print('[+] x =', x) print('[+] y =', y) print('[+] z =', z) key = sha256(w + x + y + z).digest() cipher = AES.new(key, AES.MODE_ECB) flag = unpad(cipher.decrypt(enc_flag), AES.block_size).decode() print('[*] flag =', flag)
実行結果は以下の通り。
[+] w = b'_c*'
[+] x = b'A?S'
[+] y = b'c=e'
[+] z = b'A_*'
[*] flag = crew{m1tm_at74cK_1s_g0lD_4nd_py7h0n_i5_sl0w!!}
crew{m1tm_at74cK_1s_g0lD_4nd_py7h0n_i5_sl0w!!}