软件逆向工程所涉及知识面较为广泛,本系列文章注重从动手出发,在过程中对知识点查漏补缺,适合各类对软件逆向有兴趣的朋友(这就是传说中的野路子HHH)。如果你有充分的时间去研究学习,那么还是建议从基础一步一步走下去。如果文中存在错误请及时指出,以免误导新人。
本节主要介绍在软件逆向工程中所常用的一款工具IDA Pro,该工具对于刚刚接触的人员还是需要一定的知识储备,这里会介绍其一些操作、功能和动态调试的方法。
IDA Pro是一款交互式的反汇编工具,支持常见的PE格式,DOS、UNIX、Mac、Java、.NET等平台的文件格式。
拿到文件载入后,开始会让选择载入方式,一般情况下我们选择默认的第一种即可,当然也可以载入二进制文件,具体各类打开效果自己可以体验一下。
载入分析后,会在所打开文件的目录下生成以下几个文件。
· id0:二叉树形式的数据库
· id1:程序字节标识
· nam:Named窗口的索引信息
· til:给定数据库的本地类型定义的相关信息
之后如果退出后保存的idb文件中就包含这些内容。
载入后如下
1、窗口介绍
它有两种显示模式,可以通过右键菜单Text View和Graph View进行跳转。快捷键:空格
当我们把这个页面不小心关掉时,可以通过View-open subviews-disassembly调出来,或者使用windows-reset desktop也可以。
我们也可以对该页面进行一些简单的设置,有助于我们更为简便的分析代码。
在Graph View视图下增加函数偏移地址,方便我们取址。
在菜单栏中设置:option–>general,勾选line prefixes选项。
添加后效果
开启了自动注释的功能后,IDA就可以直接告诉你汇编指令的意思,对新手十分友好。
在菜单栏中设置:option–>general,勾选auto comments
添加后效果
alt+A键打开ASCII string style窗口
然后点击set default encodings 在弹出框中选择8-bit的change 选择utf-8
显示16进制,默认为只读状态,可以通过快捷键F2在只读和编辑状态下切换。
可以通过快捷键shift+F12调用出来,显示程序中所有的字符串。
导出/入窗口(imports\exports):导出窗口列出文件的入口点,导入窗口列出由被分析的二进制文件导入的所有函数
函数窗口(functions):函数名称,区域,起始位置,长度,描述函数的标记
结构体窗口(structures):分析数据结构,双击数据结构名称展开,查看详细布局
枚举窗口(enums):enums可列举,定义枚举类型
1. a:将数据转换为字符串
2. f5:一键反汇编
3. esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
4. shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
5. ctrl+w:保存ida数据库
6. ctrl+s:选择某个数据段,直接进行跳转
7. ctrl+鼠标滚轮:能够调节流程视图的大小
8. x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
9. g:直接跳转到某个地址
10. n:更改变量的名称
11. y:更改变量的类型
12. / :在反编译后伪代码的界面中写下注释
13. \:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
14. ;:在反汇编后的界面中写下注释
15. ctrl+shift+w:拍摄IDA快照
16. u:undefine,取消定义函数、代码、数据的定义
把ida中dbgsrv目录下的linux_server或者linux_serverx64放到linux中
并执行chmod a+x 赋予执行权限。我们演示用的小程序是X64的,所以拷贝后执行下图命令。
执行后会开启端口监听。
Debugger选项下,做如图中选择
然后debugger–>process options
application和input file 都是填写在远程机器中的elf的路径,记得要加文件名
directory 填写elf所在目录,不用加文件名
hostname是虚拟机的ip地址,port是默认的连接端口
parameter和password一般都不用填
这里我的程序是放在/root下,名称为1。配置如下图。
单击小蓝点下断点,F9运行程序
连接成功后如下图。
F7:单步步入,遇到函数,将进入函数代码内部
F8:单步步过,执行下一条指令,不进入函数代码内部
F4:运行到光标处(断点处)
F9:继续运行
ctrl+F2:终止一个正在运行的调试进程
ctrl+F7:运行至返回,直到遇到RETN(或断点)时才停止
按F8单步来到判断处,根据第一节所讲,这里只需要修改函数跳转即可。
继续F8往下运行,可以看到经过cmp判断比较,程序即将根据ZF位的值进行跳转,如果这里不做任何处理,那么程序将到达4005E5处,继续运行输出Passwd Error.
这里我们修改ZF位的值,将其改为1。
然后让程序继续运行,观察远程机器上程序输出,可以看到已经成功绕过,输出hello world!