<
软件逆向入门03
>
上一篇

隐藏js到图片绕过CSP防护
下一篇

CTF中由于版本控制导致的文件泄露
IDApro使用

0x01 前言

软件逆向工程所涉及知识面较为广泛,本系列文章注重从动手出发,在过程中对知识点查漏补缺,适合各类对软件逆向有兴趣的朋友(这就是传说中的野路子HHH)。如果你有充分的时间去研究学习,那么还是建议从基础一步一步走下去。如果文中存在错误请及时指出,以免误导新人。

本节主要介绍在软件逆向工程中所常用的一款工具IDA Pro,该工具对于刚刚接触的人员还是需要一定的知识储备,这里会介绍其一些操作、功能和动态调试的方法。

0x02 IDA Pro介绍

IDA Pro是一款交互式的反汇编工具,支持常见的PE格式,DOS、UNIX、Mac、Java、.NET等平台的文件格式。

拿到文件载入后,开始会让选择载入方式,一般情况下我们选择默认的第一种即可,当然也可以载入二进制文件,具体各类打开效果自己可以体验一下。

image-20200914193643624

载入分析后,会在所打开文件的目录下生成以下几个文件。

· id0:二叉树形式的数据库

· id1:程序字节标识

· nam:Named窗口的索引信息

· til:给定数据库的本地类型定义的相关信息

之后如果退出后保存的idb文件中就包含这些内容。

载入后如下

image-20200914193715874

1、窗口介绍

IDA view

它有两种显示模式,可以通过右键菜单Text View和Graph View进行跳转。快捷键:空格

当我们把这个页面不小心关掉时,可以通过View-open subviews-disassembly调出来,或者使用windows-reset desktop也可以。

image-20200914193740330

image-20200914193751869

我们也可以对该页面进行一些简单的设置,有助于我们更为简便的分析代码。

增加函数偏移地址

在Graph View视图下增加函数偏移地址,方便我们取址。

在菜单栏中设置:option–>general,勾选line prefixes选项。

image-20200914193813596

添加后效果

image-20200914193837687

添加反编译注释

开启了自动注释的功能后,IDA就可以直接告诉你汇编指令的意思,对新手十分友好。

在菜单栏中设置:option–>general,勾选auto comments

添加后效果

image-20200914193905438

中文乱码解决

alt+A键打开ASCII string style窗口

然后点击set default encodings 在弹出框中选择8-bit的change 选择utf-8

Hex view窗口

显示16进制,默认为只读状态,可以通过快捷键F2在只读和编辑状态下切换。

image-20200914194138460

strings字符串窗口

可以通过快捷键shift+F12调用出来,显示程序中所有的字符串。

image-20200914194212481

其他窗口介绍

0x03 常用快捷键

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,取消定义函数、代码、数据的定义

0x04 动态调试ELF文件

连接到远程调试

把ida中dbgsrv目录下的linux_server或者linux_serverx64放到linux中

并执行chmod a+x 赋予执行权限。我们演示用的小程序是X64的,所以拷贝后执行下图命令。

执行后会开启端口监听。

image-20200914194516344

本地IDA设置

Debugger选项下,做如图中选择

image-20200914194601845

然后debugger–>process options

application和input file 都是填写在远程机器中的elf的路径,记得要加文件名

directory 填写elf所在目录,不用加文件名

hostname是虚拟机的ip地址,port是默认的连接端口

parameter和password一般都不用填

这里我的程序是放在/root下,名称为1。配置如下图。

image-20200914195148480

单击小蓝点下断点,F9运行程序

image-20200914194702605

连接成功后如下图。

image-20200914194732462

连接调试

F7:单步步入,遇到函数,将进入函数代码内部

F8:单步步过,执行下一条指令,不进入函数代码内部

F4:运行到光标处(断点处)

F9:继续运行

ctrl+F2:终止一个正在运行的调试进程

ctrl+F7:运行至返回,直到遇到RETN(或断点)时才停止

按F8单步来到判断处,根据第一节所讲,这里只需要修改函数跳转即可。

image-20200914194817593

继续F8往下运行,可以看到经过cmp判断比较,程序即将根据ZF位的值进行跳转,如果这里不做任何处理,那么程序将到达4005E5处,继续运行输出Passwd Error.

image-20200914194836943

这里我们修改ZF位的值,将其改为1。

image-20200914194904743

然后让程序继续运行,观察远程机器上程序输出,可以看到已经成功绕过,输出hello world!

image-20200914195032782

Top
Foot