バグも無いのにデバッグしないでください!!!
渡された実行ファイルをGhidraで解析するとbinary
という定数の各バイトに0x16でxorを取ったものを実行していると分かる。
なので、以下の愚直なスクリプトを回して渡された実行ファイルから実行されるファイルを抽出する
#!/usr/bin/env python3
b = binaryをそのままパクったもの
f = open('out.elf', 'wb')
for i in b:
f.write(int.to_bytes(i ^ 0x16, 1, 'little'))
するとELFファイルが生成されるのでこれもまたGhidraに投げる。
こちらを読んでいくと、まず定数KEY
の全ての要素に対してその添字でxorを取っていることが分かる。
次にそのKEY
を用いてRC4で入力を暗号化している。
そしてその暗号文が定数ENC
と一致するかどうかを比較している。
つまり、ENC
を復号すれば平文が得られる。
RC4は共通鍵暗号なので、xorを取った後のKEY
で普通にENC
を復号できる。
ということでソルバ
#!/usr/bin/env python3
from Crypto.Cipher import ARC4
KEY = bytearray(b'\x62\x31\x34\x62\x65\x37\x60\x32\x69\x3c\x68\x6f\x6a\x3b\x6d\x6e\x71\x26\x23\x2b\x23\x2d\x21\x24\x2c\x2f\x2f\x78\x79\x24\x29\x2f\x44\x11\x16\x45\x10\x10\x1f\x43')
ENC = b'\x27\xd9\x65\x3a\x0f\x25\xe4\x0e\x81\x8a\x59\xbc\x33\xfb\xf9\xfc\x05\xc6\x33\x01\xe2\xb0\xbe\x8e\x4a\x9c\xa9\x46\x73\xb8\x48\x7d\x7f\x73\x22\xec\xdb\xdc\x98\xd9\x90\x61\x80\x7c\x6c\xb3\x36\x42\x3f\x90\x44\x85\x0d\x95\xb1\xee\xfa\x94\x85\x0c\xb9\x9f\x00'
for i in range(0x28):
KEY[i] = KEY[i] ^ i
cipher = ARC4.new(KEY)
flag = cipher.decrypt(ENC)
print(flag)
ctf4b{D0_y0u_kn0w_0f_0th3r_w4y5_t0_d3t3ct_d36u991n9_1n_L1nux?}
シンボル残ってたし今年のctf4bはBeginners(笑)ではなかった。いいことだ