俗话说,工欲善其事,必先利其器,在二进制安全的学习中,使用工具尤其重要,而IDA又是玩二进制的神器,之前在使用IDA的时候,只是用几个比较经常使用的功能,对于IDA的其余功能没有去研究,因而本着学习的精神,参考着《IDA pro权威指南》(第二版),写下这篇文章,记录本身的学习心得,下面的记录都是在Windows平台下的IDA pro7.0进行的node
在《IDA pro权威指南》的开篇一两章中,先是介绍了几款经常使用于二进制研究的工具,我这里简单的记了几个,介绍一波:python
C++filt:
能够用于显示出c++中复杂的重载后的函数名称linux
PE tools:
是一组用于分析Windows系统中正在运行的进程和可执行文件的工具c++
string:
能够用于直接搜索出elf文件中的全部字符串
参数-a 表示搜索整个文件,参数-t 能够显示出每个字符串的偏移,参数-e 能够用于搜索更多的字符编码的字符串,如Unicode编码git
strip:github
可用于elf去符号,去符号后仍然保持正常功能但增长了逆向的难度,出题恶人必备数据库
开发了IDA的天才是Ilfak,他的我的博客有不少IDA的教程
https://www.hexblog.com/windows
连接:https://pan.baidu.com/s/1raeaYU4 密码:iz4capi
在IDA的安装根目录下有许多文件夹,各个文件夹存储不一样的内容数组
cfg:包含各类配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,
idc:包含IDA内置脚本语言IDC所须要的核心文件
ids:包含一些符号文件
loaders:包含用于识别和解析PE或者ELF
plugins:附加的插件模块
procs:包含处理器模块
IDA中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个经常使用的:
a:将数据转换为字符串
f5:一键反汇编
esc:回退键,可以倒回上一部操做的视图(只有在反汇编窗口才是这个做用,若是是在其余窗口按下esc,会关闭该窗口)
shift+f12:能够打开string窗口,一键找出全部的字符串,右击setup,还能对窗口的属性进行设置
ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:可以调节流程视图的大小
x:对着某个函数、变量按该快捷键,能够查看它的交叉引用
g:直接跳转到某个地址
n:更改变量的名称
y:更改变量的类型
/ :在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松不少
;:在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u:undefine,取消定义函数、代码、数据的定义
因为IDA不提供撤销的功能,若是你不当心按到某个键,致使ida数据库发生了改变,就得从新来过,因此要记得在常常操做的时候,加上快照:file-->take database snapshot
加完快照后,会生成一个新的ida数据库文件,本质上是有点像另存的操做
快捷键:ctrl+shift+w
view-->open subviews: 能够恢复你无心中关闭的数据显示窗口
windows-->reset desktop: 能够恢复初始ida布局
option-->font: 能够改变字体的相关属性
IDA中的流程视图能够说是很是的好用,简单明了地能看出程序的执行流程,尤为是在看if分支代码和循环代码的时候,可以很是直观
可是,咱们还能够改得更加好用,在这个视图中添加地址偏移的话,咱们取地址就很是方便,再也不须要按空格切换视图去找,在菜单栏中设置:option-->general
将该选项打钩后就能够看到效果了:
这个功能对于萌新来讲很是友好,在刚刚初学汇编的时候, 不免遇到几个不经常使用的蛇皮汇编指令,就得本身一个个去查,很麻烦,开启了自动注释的功能后,IDA就能够直接告诉你汇编指令的意思
一样是在菜单栏中设置:option-->general
效果以下:
在操做IDA的时候,常常会遇到须要建立数组的状况,尤为是为了能方便咱们看字符串的时候,建立数组显得很是必要,如下我随便找了个数据来建立数组
首先点击选中你想要转换成数组的一块区域:
接着在菜单栏中选择:edit-->array,就会弹出以下的选项框
下面来解释一下各个参数的意思:
Array element size
这个值表示各数组元素的大小(这里是1个字节),是根据你选中的数据值的大小所决定的
Maximum possible size
这个值是由自动计算得出的,他表示数组中的元素的可能的最大值
Array size
表示数组元素的数量,通常都根据你选定的自动产生默认值
Items on a line
这个表示指定每一个反汇编行显示的元素数量,它能够减小显示数组所需的空间
Element print width
这个值用于格式化,当一行显示多个项目时,他控制列宽
Use “dup” construct
:使用重复结构,这个选项可使得相同的数据值合并起来,用一个重复说明符组合成一项
Signed elements
表示将数据显示为有符号数仍是无符号数
Display indexes
显示索引,使得数组索引以常规的形式显示,若是选了这个选项,还会启动右边的Indexes选项栏,用于选择索引的显示格式
Create as array
建立为数组,这个通常默认选上的
建立好了之后,就变成了这样:
能够看到这些数据已经被当成一个数组折叠到了一块儿,其中2 dup(0FFh)
这样的,表示有两个重复的数据0xff
在流程视图中,分支过多的时候,能够在窗口标题处右击选择group nodes,就能把当前块折叠起来
效果以下:
分支块是能够本身命名的,方便本身逆向理解
菜单栏中:view-->graphs-->Function calls(快捷键Ctrl+F12)
这个图能很清楚地看到函数之间是如何相互调用的
菜单栏中:view-->graphs-->flowt chart(快捷键F12)
这个其实跟IDA自带的反汇编流程视图差很少,他能够导出来做为单独的一张图
建立结构体是在IDA的structures窗口中进行的,这个操做在堆漏洞的pwn题中常用
能够看到,这里已经存在了四个结构体,程序自己存在的,能够右击选择hide/unhide,来看具体的结构体的内容
建立结构体的快捷键是:insert
在弹出的窗口中,能够编辑结构体的名字
这底下有三个复选框,第一个表示显示在当前结构体以前(就会排列在第一位,不然排列在你鼠标选定的位置),第二个表示是否在窗口中显示新的结构体,第三个表示是否建立联合体。
须要注意的是,结构体的大小是它所包含的字段大小的总和,而联合体的大小则等于其中最大字段的大小
在单击ok之后,就定好了一个空的结构体:
将鼠标放在 ends这一行,单击快捷键D便可添加结构体成员,成员的命名默认是以field_x表示的,x表明了该成员在结构体中的偏移
同时,能够把鼠标放在结构体成员所在的行,按D,就能够切换不一样的字节大小
默认状况下可供选择的就只有db,dw,dd(1,2,4字节大小)
若是想添加型的类型,能够在option-->setup data types(快捷键Alt+D),进行设置
如图,勾选了第五个和第九个的话,就会出现dq和xmmword了(表明了8字节和16字节)
若是要添加数组成员则能够对着成员所在的那一行,右击选择array
如图,要建立的是16个元素的4字节数组
若是要删除结构体,那么对着结构体按下delete键便可删除
若是要删除成员,则对着成员按下u(undefine)可是须要注意的是,这里只是删除了成员的名字,而没有删除它所分配的空间
如图,咱们删除了中间的field_10的数组成员:
会变成这样:
数组所分配的20个字节的空间并无被删除,这时若是要删除掉这些空间,就须要在原来数组成员所在的第一行中按下Ctrl+S,删除空间(Edit-->shrink struct types)
就能够真正的删除掉成员
给结构体的成员重命名能够用快捷键N
咱们在IDA中建立好告终构体之后,就是去应用它了
如图,这是一个典型的堆的题目
能够看到v1是一个新建的chunk的地址指针,然后的操做都是往chunk不一样的偏移位置写入内容,为了方便咱们逆向观察,能够将其变成一个结构体,经过v1
v1+4
v1+0x48
这样的偏移,建立好结构体后,将char *v1
的类型改为mail *v1
,(快捷键Y能够更改函数、变量的类型和参数)这个mail是咱们建立的结构体的名称,效果以下:
实际上,IDA有提供一个更方便的建立结构体的方法,就是直接写代码导入
在View-->Open Subviews-->Local Types中能够看到本地已有的结构体,在该窗口中右击insert
能够添加新的结构体:
这样就导入了新的结构体:
但同时咱们发现structure视图里面,并无这个结构体,咱们须要对着my_structure右击,选择 synchronize to idb
这样structure视图就有了,如图
这里你会发现,多出来两个db的undefined的成员,这是由于ida默认是会把结构体统一4字节对齐的,知足结构体的大小为0x28
这里我以一个在Ubuntu虚拟机中的elf为例子,进行调试
首先把ida目录中的dbgsrv文件夹中的linux_server64拷贝到Ubuntu的elf的文件夹下,这个elf是64位的全部用的是linux_server64,若是你调试的是32位的程序,你就须要拷贝linux_server
记得给他们权限,而后在终端运行,这个程序的做用就像是链接ida和虚拟机中elf的桥梁
而后再到ida中进行配置:
在菜单栏中选择:debugger-->process options
注意,application和input file 都是填写在虚拟机中的elf的路径,记得要加文件名
而directory 填写elf所在目录,不用加文件名
hostname是虚拟机的ip地址,port是默认的链接端口
parameter和password通常都不用填
设置好了之后点击ok
接着能够直接在反汇编视图中下断点,只要点击左边的小蓝点便可
这时按下快捷键F9,能够直接开始调试
按下快捷键F4,则直接运行到断点处停下
这个就是基本的各个功能区的介绍,上面是我比较喜欢的经常使用布局,和ida默认的不太同样,想要自定义添加一些视图的话,能够在debugger-->quick debug view中添加
另外能够在Windows-->save desktop来保持当前的视图布局,之后就能够直接加载使用
下面介绍一些经常使用的快捷键
F7
单步步入,遇到函数,将进入函数代码内部F8
单步步过,执行下一条指令,不进入函数代码内部F4
运行到光标处(断点处)F9
继续运行CTRL+F2
终止一个正在运行的调试进程CTRL+F7
运行至返回,直到遇到RETN(或断点)时才中止.
知道了这些快捷键后,调试起来就比较容易了,ida调试有个比较方便的地方在于能直接看到函数的真实地址,下断点也很是直观易操做
在IDA的最下面有个不起眼的Output Window的界面,实际上是一个终端界面,这里有python终端和IDC终端
这里的python是2.7的版本,虽然老了点,但已经足够咱们用了,在IDA的运用中,咱们常常须要计算地址,计算偏移,就能够直接在这个终端界面进行操做,很是方便
固然上面说的只是很简单的python用法,真正的IDA-python的用法是这样的:
这里以简单的一道逆向题来作个例子
这个程序很简单,一开始来个for循环,把judge函数的内容所有异或0xc,这样就致使了程序一运行就会直接破坏掉judge函数
从而使得无法进行后面的flag判断
这里咱们就须要写一个脚原本先把被破坏的内容还原,这里IDA提供了两种写脚本操做的方法,一种就是IDC脚本,一种就是python脚本
这里只简单的介绍IDA-python
而IDA-python经过三个python模块将python代码注入IDA中:
idaapi模块负责访问核心IDA API
idc模块负责提供IDA中的全部函数功能
idautils模块负责提供大量实用函数,其中许多函数能够生成各类数据库相关对象的python列表
全部的IDApython脚本会自动导入idc和idautils模块,而idaapi模块得本身去导入
这里贴上IDApython的官方函数文档,这里包含了全部函数,值得一看
针对以上的题目,咱们只须要作一个脚本,指定judg函数的0-181范围的字节异或0xc,便可恢复
judge=0x600B00 for i in range(182): addr=0x600B00+i byte=get_bytes(addr,1)#获取指定地址的指定字节数 byte=ord(byte)^0xC patch_byte(addr,byte)#打patch修改字节
在菜单栏中file-->script file,加载python脚本
接着在judge函数中undefined掉原来的函数,在从新生成函数(快捷键p),就能够从新f5了
脚本中出现的函数都是已经封装在idc模块中的,具体可查官方文档
这只是一个简单的IDApython的使用例子,实际上这个功能很是强大,能弄出很是骚的操做
打patch,其实就是给程序打补丁,本质上是修改程序的数据,指令等,这在CTF中的AWD赛制中常常用到,发现程序漏洞后立刻就要用这个功能给程序打好patch,防止其余队伍攻击咱们的gamebox
这里,我是用一个叫keypatch的插件进行操做的,IDA自带的patch功能不太好用
这个很简单,教程在github就有
下载Keypatch.py复制到插件目录
IDA 7.0\plugins\Keypatch.py
下载安装keystone python模块,64位系统只须要安装这一个就行
https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi
安装好后,你就会发现这里有个keypatch的选项
若是咱们要修改程序自己的指令,怎么作呢
如图,咱们要修改63h这个值
将鼠标指向改行,按快捷键Ctrl+Alt+K
直接输入汇编语句便可修改,打好patch后效果如图:
这里会生成注释告诉你,这里打过patch,很是人性化
接着还要在菜单栏进行设置才能真正使得patch生效
这样一来,原来的程序就已经被修改了
若是不当心打错了patch,就能够在这里进行撤销上一次patch的操做了
可是若是打了不少次patch,很差分清该撤销哪一次的patch,那么能够在菜单栏中打开patched bytes界面
看到全部的patch,要撤销哪个就右击选择 revert
在菜单栏中,这里有个选项能够生成各类不一样的输出文件
这里简单的介绍前两个文件,后面的你们能够本身去生成测试一下用途,我这里就不详细介绍了
.map文件描述二进制文件的整体结构,包括与构成改二进制文件的节有关的信息,以及每一个节中符号的位置。
.asm文件,也就是汇编了,直接能导出ida中反汇编的结果,这个很是实用,有的时候在逆向中常常遇到大量数据加解密的状况,若是在从IDA中一个个慢慢复制可就太没效率了,直接导出生成asm,在里面复制数据快不少
IDA常常会自动生成假名字。他们用于表示子函数,程序地址和数据。根据不一样的类型和值假名字有不一样前缀
sub 指令和子函数起点
locret 返回指令
loc 指令
off 数据,包含偏移量
seg 数据,包含段地址值
asc 数据,ASCII字符串
byte 数据,字节(或字节数组)
word 数据,16位数据(或字数组)
dword 数据,32位数据(或双字数组)
qword 数据,64位数据(或4字数组)
flt 浮点数据,32位(或浮点数组)
dbl 浮点数,64位(或双精度数组)
tbyte 浮点数,80位(或扩展精度浮点数)
stru 结构体(或结构体数组)
algn 对齐指示
unk 未处理字节
IDA中有常见的说明符号,如db、dw、dd分别表明了1个字节、2个字节、4个字节
目前来讲, 我遇到的反编译报错的状况,通常是两种
一是因为程序存在动态加密,致使程序的某些代码段被修改,从而反编译出错,这种状况,就须要去使用IDA-python解密一波,再进行F5反汇编
二是因为某些玄学问题,直接提示了某个地方出错,通常来讲,就按照IDA的提示,去进行修改
好比,出现以下报错:
那咱们就去找413238这个地址的地方,提示是说sp指针的值没有被找到,说明是这里出错了,那么就去修改sp的值,修改方法以下:
也可使用快捷键 Alt+K
有的时候,遇到的这种报错
就尝试着把报错的地址的汇编语句改一哈,改为nop,就能够解决问题
目前来讲,我遇到报错的状况很少,通常均可以经过以上方法解决
在ida的根目录的cfg文件夹是专门用来存储配置文件的
ida的主配置文件为ida.cfg,另外的还有idagui.cfg,idatui.cfg这两个配置文件对应IDA的GUI配置和文本模式的版本
1、ida.cfg
该文件包含了option-->general中的全部选项的配置,能够经过选项中的描述在配置文件总找到相应的选项
这里举几个例子:
SHOW_AUTOCOMMENTS
表示是否自动生成汇编指令的注释
GRAPH_SHOW_LINEPREFIXES
表示是否在流程控制视图中显示地址
VPAGESIZE
表示内存调整参数,当处理很是大的输入文件时,IDA可能报告内存不足而没法建立新数据库,在这种状况下增大该参数,从新打开输入文件便可解决问题
OPCODE_BYTES
表示要显示的操做码字节数的默认值
INDENTATION
表示指令缩进的距离
NameChars
表示IDA支持的变量命令使用的字符集,默认是数字+字母还有几个特殊符号,若是须要添加就改变该参数
2、idagui.cfg
这个文件主要配置默认的GUI行为,键盘的快捷键等,这个不多须要修改,不作过多介绍。感兴趣的能够本身打开该文件观察,并不难懂,改改快捷键仍是很容易的
3、idatui.cfg
这个彷佛更加不经常使用。。。很少说了
须要注意的是,以上三个文件是默认配置,也就是说,每次打开建立新的ida数据库的时候,都会以这三个配置文件的设置进行建立,以前临时在菜单栏的设置就会消失,要永久设置ida的配置,就改这三个文件
但,凡是都有例外,在option-->font和option-->colors这两个选项是全局选项,修改一次就永久生效的,不用在以上三个配置文件中改
经过这一次系统地去学IDA,发现这个软件真的是很是厉害,我上面也只是简单地记录了平时比较经常使用的功能和操做,IDA还有不少高级的开发技巧,甚至你还能自定义模块和加载器等,也能本身制做ida的插件,在这个过程当中,发现看书真的很重要,本身看书和看网上别人总结的,彻底不同,搞二进制仍是得踏踏实实打好基础,所谓万丈高楼平地起。之前以为每天对着电脑搞这些很累,进步又慢感受很难,而经历这个黑暗寒假,我才知道这些东西再难也难不过生活,有个安安静静平平稳稳的生活去搞技术又未尝不是一种幸运。
若是其余大佬还有别的IDA小技巧骚操做,能够留言交流一哈
from:https://xz.aliyun.com/t/4205