逆向学习(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} |
不戳,逆向还蛮好玩的~