CpawCTF Q7.[Reversing] Can you execute ? Writeup Using Ghidra
12674 ワード
SECCON Beginners CTF 2021 の discord でCpawCTFの存在を知りました。
さっそく勉強開始。
問題
Q7.[Reversing] Can you execute ?
10pt
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。
この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…
問題ファイル: exec_me
Solution
こういう問題を見たら意地でも動かしたくない。
strings でダメだったので Ghidra で静的解析する。
初期デコンパイル結果
main
undefined8 main(void)
{
int local_7c;
undefined4 local_78 [4];
undefined4 local_68;
undefined4 local_64;
undefined4 local_60;
undefined4 local_5c;
undefined4 local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_34;
undefined4 local_30;
undefined4 local_2c;
undefined4 local_28;
undefined4 local_24;
undefined4 local_20;
undefined4 local_1c;
undefined4 local_18;
undefined4 local_14;
undefined4 local_10;
local_78[0] = 0x4d;
local_78[1] = 0x5a;
local_78[2] = 0x4b;
local_78[3] = 0x61;
local_68 = 0x65;
local_64 = 0x2e;
local_60 = 0x59;
local_5c = 0x49;
local_58 = 99;
local_54 = 0x59;
local_50 = 0x5f;
local_4c = 0x49;
local_48 = 0x55;
local_44 = 0x58;
local_40 = 0x59;
local_3c = 0x61;
local_38 = 0x49;
local_34 = 0x2f;
local_30 = 0x36;
local_2c = 0x30;
local_28 = 0x49;
local_24 = 0x50;
local_20 = 0x53;
local_1c = 0x56;
local_18 = 0x4f;
local_14 = 0x29;
local_10 = 0x67;
local_7c = 0;
while (local_7c < 0x1b) {
putchar((int)(char)((char)local_78[local_7c] + '\x16'));
local_7c = local_7c + 1;
}
putchar(10);
return 0;
}
チューニング
変数名
local_7c --> i
local_78 --> flag
local_78 の型
undefined4[4] --> byte[27]
main改
undefined8 main(void)
{
int i;
byte flag [27];
flag._0_4_ = 0x4d;
flag._4_4_ = 0x5a;
flag._8_4_ = 0x4b;
flag._12_4_ = 0x61;
flag._16_4_ = 0x65;
flag._20_4_ = 0x2e;
stack0xffffffffffffffa0 = 0x59;
i = 0;
while (i < 0x1b) {
putchar((int)(char)((char)*(undefined4 *)(flag + (long)i * 4) + '\x16'));
i = i + 1;
}
putchar(10);
return 0;
}
んーん。直らねー。
ほっといて Ghidra Script 書いちゃう
test_cpaw.py
ans=[]
inst = getInstructionAt(toAddr(0x00400535))
i = 0
while i < 0x1b:
ans.append(inst.getOpObjects(1)[0].getValue()+0x16)
inst = inst.getNext()
i = i + 1
print(''.join(map(chr,ans)))
デコンパイル結果がいまいちで残念。
Author And Source
この問題について(CpawCTF Q7.[Reversing] Can you execute ? Writeup Using Ghidra), 我々は、より多くの情報をここで見つけました https://qiita.com/housu_jp/items/37c9d94bd6f5be1e45f1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .