IDA作为一款强大的反汇编工具,能够将程序的二进制代码转换成可读的汇编代码,帮助我们在静态分析的过程中更加直观的看到程序的运行机制。

导入文件的过程和界面

打开IDA后的界面如下图,根据提示打开想要分析的文件即可,此处先使用前面编写的输出Hello World!的程序进行分析。

image-20241212163030514

打开后,界面如下:

image-20241212163428469

图形界面:

image-20241212163623875

在该界面下使用空格键,可以切换到本文内容:

image-20241212163728203

IDA打开后,默认的为反汇编窗口:

image-20241212163848240

十六进制窗口

image-20241212163924319

导入表,双击可以查看引用:

image-20241212164255240

导出表,同理可以双击导出表函数,定位代码:

image-20241212164358263

以上为常用到的内容,IDA功能实在过多,后续使用到现场学习。

生成伪代码

在IDA中,按F5可以讲当前反汇编的内容转换为伪代码,以提高可读性。

以下是我的程序的伪代码,可以看出,因为程序功能较为简单,生成的伪代码准确率还是很高的:

image-20241212164835626

实践尝试

题目:Jarvis-stheasy

使用IDA打开题目附件

image-20241212212335417

F5查看伪代码:

image-20241212212414576

进入main函数

image-20241212220947037

在main函数里可以看到,这个程序主要点在于if语句,那么再深入看看su b_8048630函数

image-20241212221107368

输入参数为s,从上一层可以看出s就是flag,第一个if表示flag的长度应该为29,后续while判定:

1
flag[v2] = byte_8049AE0[byte_8049B15[v2]/3u - 2]

也就是说,flag的每一位都等于byte_8049AE0[byte_8049B15[v2]/3u - 2]的话,就会一直返回1,就是我们所要的flag。

在IDA中,使用Export Data功能(shift+E),可以直接导出字符串或数组里的内容,此处我就导出byte_8049AE0和byte_8049B15的看一下,此处还可以选择格式:

image-20241212224104462

都导出来,按照上述的思路编写脚本,脚本内数据取的多了点,但是我们知道flag是29位的,且代码中计算flag=a[b[v2]/3u - 2](在C或C++中,3u表示无符号整数常量3(unsigned int)):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a = [
0x6C, 0x6B, 0x32, 0x6A, 0x39, 0x47, 0x68, 0x7D, 0x41, 0x67,
0x66, 0x59, 0x34, 0x64, 0x73, 0x2D, 0x61, 0x36, 0x51, 0x57,
0x31, 0x23, 0x6B, 0x35, 0x45, 0x52, 0x5F, 0x54, 0x5B, 0x63,
0x76, 0x4C, 0x62, 0x56, 0x37, 0x6E, 0x4F, 0x6D, 0x33, 0x5A,
0x65, 0x58, 0x7B, 0x43, 0x4D, 0x74, 0x38, 0x53, 0x5A, 0x6F,
0x5D, 0x55, 0x00
]

b = [
0x48, 0x5D, 0x8D, 0x24, 0x84, 0x27, 0x99, 0x9F, 0x54, 0x18,
0x1E, 0x69, 0x7E, 0x33, 0x15, 0x72, 0x8D, 0x33, 0x24, 0x63,
0x21, 0x54, 0x0C, 0x78, 0x78, 0x78, 0x78, 0x78, 0x1B, 0x00,
0x00
]

for i in range(29):
print(chr(a[int(b[i]/3 - 2)]), end="")

得到flag:

1
kctf{YoU_hAVe-GOt-fLg_233333}

不戳,逆向还蛮好玩的~