Ghira

其实我觉得和IDA 差不多吧

下载地址:

https://Ghidra-sre.org

需要又java 11+ 【我用的是java 11】

主要就不介绍了,用法感觉和IDA 差不多

我们先来写一个题【CTF】

该题来自 Bugku逆向 RE_Cirno

image-20230516211310012

打开发现是一个.jpg的图片 。 图片肯定有问题啦。藏得有东西

用101打开看看

image-20230516212445604

通过http://doc.chacuo.net/filehead 这个网址就能找到一些文件头的都行。然后再010里面可以搜索一下。

image-20230516212603392

其实这一步也可以省略啦。直接用工具binwalk来查看这个JPG图片

image-20230516210947106

很明显的看到,里面不只有这个jpg 还有一个zip的样子。

image-20230516211111591

用binwalk -e 的命令把他搞出来。 就得到一个exe文件。

1
binwalk -e RE_Cirno.jpg

ok 现在就是再这个exe文件里面找到flag就好了

拿到文件。首先运行一下啦

image-20230516213034725

从这里就可以看到

:琪露诺酱在冻青蛙的路上,突然被9层栅栏反方向围住了,找不到方向,你可以帮助她找到路吗?
:请按任意键继续. . .

首先分析一下:“请按任意键继续. . .” 说明程序运行到这里就停下来了。然后你按下任意一个健就退出了..

我们来猜测一下这里肯定有一个暂停的功能

pause – 暂停

用IDA 打开

image-20230516213607439

在main 里面就看到了这个pause 。 说明这里就是我们要分析的地方

看反汇编的代码

image-20230516214156786

发现调用这个pause是xref 交叉应用..我们跳转过去

image-20230516214407602

这里就是这个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.text:0040F459 68 A4 2F 42 00                push    offset Command                  ; "pause"
.text:0040F45E E8 DD FD FF FF call _system
.text:0040F45E
.text:0040F463 83 C4 04 add esp, 4
.text:0040F466 33 C0 xor eax, eax
.text:0040F468 5F pop edi
.text:0040F469 5E pop esi
.text:0040F46A 5B pop ebx
.text:0040F46B 81 C4 AC 00 00 00 add esp, 0ACh
.text:0040F471 3B EC cmp ebp, esp
.text:0040F473 E8 58 1D FF FF call __chkesp
.text:0040F473
.text:0040F478 8B E5 mov esp, ebp
.text:0040F47A 5D pop ebp
.text:0040F47B C3 retn

这里调用了_system 和 __chkesp

伪代码看一下

image-20230516220051690

发现就很奇怪…IDA7.7 和 7.0 编译出来的居然不一样….但是大致上又好像差不多…

有点蒙蔽。

而且在汇编代码中

1
.text:0040F466 33 C0                         xor     eax, eax

很明显又xor 但是这里又不管咋样的伪代码都没有….

这个很明显。这段的伪代码有问题….

难道只能看汇编代码了吗??

不,我们还有Ghira

image-20230516221042217

很明显 这个Ghira 反编译出来的就是对的…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void FUN_0040f350(void)

{
int iVar1;
undefined4 *puVar2;
undefined4 local_b0 [16];
uint local_70;
uint local_6c;
int local_68;
int local_64 [24];

puVar2 = local_b0;
for (iVar1 = 0x2b; iVar1 != 0; iVar1 = iVar1 + -1) {
*puVar2 = 0xcccccccc;
puVar2 = puVar2 + 1;
}
local_64[0] = 0x73;
local_64[1] = 0x5e;
local_64[2] = 0x61;
local_64[3] = 0x72;
local_64[4] = 0x67;
local_64[5] = 0x2f;
local_64[6] = 0x6b;
local_64[7] = 0x72;
local_64[8] = 0x41;
local_64[9] = 0x30;
local_64[10] = 0x31;
local_64[11] = 0x69;
local_64[12] = 0x75;
local_64[13] = 0x76;
local_64[14] = 0x65;
local_64[15] = 0x30;
local_64[16] = 0x71;
local_64[17] = 0x5f;
local_64[18] = 99;
local_64[19] = 0x2f;
local_64[20] = 0x5c;
local_64[21] = 0x74;
local_64[22] = 0x5d;
local_64[23] = 0x66;
for (local_68 = 0; local_68 < 0x18; local_68 = local_68 + 1) {
local_70 = local_64[local_68] + 9U ^ 9;
local_6c = local_70;
}
FUN_00401150(&DAT_00422fac);
FUN_0040f240("pause");
local_64[23] = 0x40f478;
__chkesp();
return;
}

看代码写c 这里的代码已经有反转字符串的意思了

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
char a[] = {115,94,97,114,103,47,107,114,65,48,49,105,117,118,101,48,113,95,99,47,92,116,93,102};
int i = 0;
char b = NULL;
for (i = 23; i >=0; i--) {
b = (a[i] + 9) ^ 9;
printf("%c",b);
}
return 0;
}
image-20230516223534859

最后得到这个字符串

由于题目中“琪露诺酱在冻青蛙的路上,突然被9层栅栏反方向围住了,找不到方向,你可以帮助她找到路吗?”

栅栏密码9次解密就好了

image-20230516223636053

感觉这个Ghira确实安逸,能汇编和伪代码对应着看。比较巴士

然后这个。下次IDA有问题,伪代码奇奇怪怪的时候,就可以来找找Ghidra 或者 以后IDA和这个工具结合着看。