theseus

ファイル chall が与えられた。

Ghidra で逆コンパイルすると、compare 関数に以下の部分があった。

A file chall was given.

Decompiling via Ghidra, I found this part in the function compare:

local_38 = 0x41456c6d47414c46; local_30 = 0x5f662c60692e6866; local_28 = 0x24635e573f72294e; local_20 = 0x786b;

この部分をCyberChef で変換した。

I applied some operations on CyberChef to this part.

Find / Replace, From Hex, Swap endianness - CyberChef

すると、以下の結果が得られた。

FLAGmlEAfh.i`,f_N)r?W^c$ (NUL 6個) kx

さらに、main 関数を見ると、以下の部分があった。

This is the result:

FLAGmlEAfh.i`,f_N)r?W^c$ (6 NULs) kx

Looking at the main funciton, I noticed at this part:

local_68 = 0; for (local_64 = 0; local_64 < 0x1a; local_64 = local_64 + 1) { if (3 < local_64) { local_68 = (local_64 * 0xb) % 0xf; } cVar1 = (char)local_68; if (local_64 < 8) { compare[local_64 + 0x25] = (code)((char)compare[local_64 + 0x25] + cVar1); } else if (local_64 < 0x10) { compare[local_64 + 0x27] = (code)((char)compare[local_64 + 0x27] + cVar1); } else if (local_64 < 0x18) { compare[local_64 + 0x31] = (code)((char)compare[local_64 + 0x31] + cVar1); } else { compare[local_64 + 0x39] = (code)((char)compare[local_64 + 0x39] + cVar1); } }

この部分に基づいて書いた以下のプログラムでflagが得られた。
なお、もとの部分で8バイトごとにオフセットがずれているのは、命令を避けてデータのみを書換えるためであるため、反映しなくて良い。

I obtained the flag from this program based on this part.
Note that the original fragment is moving the offset for each 8 bytes, but this is for avoiding instructions and modifying only data, so this isn't needed in my program.

solve.py

FLAG{vKCsq3jl4j_Y0uMade1t}

WaniCTF 2023