[SECCON Beginners CTF 2022] please_not_debug_me

バグも無いのにデバッグしないでください!!!

渡された実行ファイルを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(笑)ではなかった。いいことだ