pwn从入门到放弃第二章——ida的基本使用教程

其实ida与gdb的使用是一个不断学习的过程,不是一蹴而就的,所以这里只是介绍一下基本的使用方法

这里还要说一下,善用gdb和ida,能在比赛的时候加快审计和调试代程序的速度,就能更快解题拿到一血(虽然现在一血没什么用了………..

ida的使用

首先给下ida 7.0的下载地址,推荐使用7.0, 因为6.8或者更低的版本反编译成c语言代码不是很好

https://www.52pojie.cn/thread-675251-1-1.html

貌似只有百度云了,凑合着下吧…….

这里给一个比赛的二进制文件,用来作为教程的例子,记得要用64位的ida来打开

babystack

下面是ida加载完文件之后的界面,有时候会加载到start那里,所以我们双击一下左边的main

这个时候按下空格,会发现界面切换了

一开始的界面是汇编层面上的流程图,空格切换之后就是顺序的汇编代码

这个时候再按下Tab键或者f5,就可以看到反编译后的c语言代码,我比较常用的是tab,因为可以从c语言返回到汇编界面

这里是反汇编后的c语言代码

这里会看到很多sub_4008b9 这种函数,这是ida对于没有调试信息的二进制的函数的处理

单纯看着这些函数经常会看错,而且不清楚那个函数到底干了什么

所以我们就要对这些函数进行重命名

我们首先双击sub_4008b9,进入这个函数看看里面究竟干了什么

里面还有sub_400826

再点进去

发现其实就只是调用了puts

这个时候点击如图所示的红框圈着的返回

返回到上一层

单击一下sub_400826, 然后就会像下图一样变黄(感觉有点不对劲…..

然后按一下n

会弹出一个框

这里输入mputs,然后回车,可以看到那些函数都变成mputs了

下面那个函数看了下,调用了strlen,然后再调用了write,就叫它mwrite吧,改好之后就变成

所以这个函数的功能就是输出菜单

返回上一层,把这个函数改成menu吧

当把所有函数的名字都改好了之后,整个程序的逻辑就很清晰了

一般做一道pwn题,这个步骤是最先做的,做完这一步,后面就是代码审计,找出程序的漏洞

我们继续讲下ida的使用

主函数的sub_40841其实是一个读取数字的函数,我们可以将其改名为get_num

我们可以看上图中红色框框的地方,那些rsp+10h就是指明了那些变量在栈上的位置,rsp,rbp这两个是寄存器,可以简单的理解为指向栈底和栈顶的寄存器(并不完全正确,但是初步理解一下

这里我们看到,s和v6之间的空间是 0x98-0x10=0x88 这么大,这其实就说明s实际上是一个0x88字节大小的char数组

下面我们看到switch中的case 1

1
read(0,&s,0x100);

s只有0x88字节大小,但是却往里面读进去0x100字节大小的数据,这里就会导致缓冲区溢出

简单的从ida静态分析,我们就可以看出程序的漏洞在哪里

下面,我们来了解一下交叉引用和搜索

按下Tab,让右边的界面变成顺序的汇编代码,双击下左边的puts,下图红框框着的地方

然后右边就会显示

红框框着的地方就是交叉引用了

这里就显示了puts这个库函数被什么调用了

我们可以双击 main+E1

然后我们就看到

跳到main函数调用puts的地方了,再按下Tab

我们看到原来是case2 中调用了puts

那这个交叉引用在分析程序中有什么用呢?下面简单说下

假如要分析的程序非常大,有很多函数,很难一个个分析过来,这个时候看到它调用了库函数system

我们就可以靠交叉引用来找出哪一部分调用了system,再进行重点的分析

但是,有时候交叉引用显示的数量太少,我们有两个办法

  1. 选择上面的Options->General->Cross-references

改红框里面的数字就能更改显示的reference数量

  1. 直接进行搜索

按下快捷键Alt+T,会弹出如下图的搜索框

如果要不选红框那里的话,会搜索光标以下的代码,如果选了红框,会搜索整个二进制

不过这里搜索的结果有点多,要自己肉眼过滤一波

这里只是简单介绍了一下ida的使用,更详细的可以上网搜索《IDA.Pro权威指南》这本书,里面有各种ida的使用技巧