逆向学习(3)---IDA的使用和实践
IDA作为一款强大的反汇编工具,能够将程序的二进制代码转换成可读的汇编代码,帮助我们在静态分析的过程中更加直观的看到程序的运行机制。
导入文件的过程和界面
打开IDA后的界面如下图,根据提示打开想要分析的文件即可,此处先使用前面编写的输出Hello World!的程序进行分析。

打开后,界面如下:

图形界面:

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

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

十六进制窗口:

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

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

以上为常用到的内容,IDA功能实在过多,后续使用到现场学习。
生成伪代码
在IDA中,按F5可以讲当前反汇编的内容转换为伪代码,以提高可读性。
以下是我的程序的伪代码,可以看出,因为程序功能较为简单,生成的伪代码准确率还是很高的:

实践尝试
使用IDA打开题目附件

F5查看伪代码:

进入main函数

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

输入参数为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的看一下,此处还可以选择格式:

都导出来,按照上述的思路编写脚本,脚本内数据取的多了点,但是我们知道flag是29位的,且代码中计算flag=a[b[v2]/3u - 2](在C或C++中,3u表示无符号整数常量3(unsigned int)):
1 | a = [ |
得到flag:
1 | kctf{YoU_hAVe-GOt-fLg_233333} |
不戳,逆向还蛮好玩的~
