以下の内容はhttps://yocchin.hatenablog.com/entry/2024/08/06/074838より取得しました。


CrewCTF 2024 Writeup

この大会は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!!}



以上の内容はhttps://yocchin.hatenablog.com/entry/2024/08/06/074838より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14