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