OllyDbg(简称OD)是一个 32 位动态调试器,用在逆向分析方面比较多;
下面以 bugku 中 Eazy-Re 作为例子来学习OllyDbg 的简单应用;
首先打开程序,先看一下这个程序的主要是干什么,方便下一步分析:
它提示输入flag,然后判断正确与否,随便输入字母,显然不对,然后退出程序;
用 OD 打开程序,打开程序后会出现五个窗口:反汇编窗口,信息窗口,寄存器窗口,数据窗口,堆栈窗口;
简单介绍五个窗口的主要作用及运用
-
反汇编窗口
反汇编窗口显示被调试程序的汇编代码,一共有四列,从左至右,分别为地址,16进制机器码,反汇编代码以及注释;最后一列的注释中,会显示一些相关的函数参数或者运行简化表和一些字符串文本信息,这对程序分析是非常有用的。
在反汇编窗口中,默认下,双击可以进行如下操作:
- 地址列:显示被双击行地址的相对地址,再次双击返回标准地址模式(目前还不太懂什么意思,但是能观察到有变化)
- 十六进制机器码列:设置(下)或取消断点,断点相当于将程序运行时卡在运行中的某个地方,对应快捷键为 F2
- 反汇编代码列:调用汇编器,可以直接修改汇编代码,对应快捷键为 空格键
- 注释列:增加或者编辑注释,对应快捷键为 ;
-
信息窗口
在进行动态跟踪时,信息窗口显示与指令相关的各寄存器的值,API函数调用提示和跳转提示等信息;
-
数据窗口
数据窗口默认左半边是 16 进制 ,右半边是 对应的ascii码来显示内存中的数据。要查看指定位置的数据,可以使用快捷键 Ctrl+G ,输入地址进行跳转;
-
寄存器窗口
寄存器窗口显示 CPU 各寄存器中的值,支持多种寄存器,可以单击右键或者窗口标题切换显示寄存器的方式;
-
堆栈窗口
堆栈窗口显示堆栈里的内容,即ESP指向地址的内容,各API函数和子程序都利用堆栈来传递参数和变量等。
解题:
在运行程序的时候,有出现输入flag的提示,所以我们首先在反汇编窗口空白处 - -> 右键 --> 中文搜索引擎 --> 搜索ASCII, 这样可以查看程序中所有出现的可见ASCII字符,然后 Ctrl +F 搜索之前程序中出现的提示字符,其实做到这里题已经解了,但是我们拿这道题来继续分析,实现OD 的简单运用。
这里假设我们没有看见正确flag,只看见了关于flag的正确或错误的提示,我们在 “flag不太对…” 这个字符串的地方双击,跳转到对应这个字符的反汇编窗口:
可以看见,输出正确提示 与 错误提示相距不会很远,并且发现 输出正确提示 前面有一个 jne 跳转指令,双击这条汇编代码会跳转到相应的位置,所以这个跳转指令前面应该是有一个判断,将正确的flag 与我们输入的字符串进行比较,然后当然是条件不成立,然后跳转至 输出错误提示;
那么,这里我们稍微思考一下,如果说我们在 jne 这个汇编指令下断点,那么我们运行程序到这里,进行调试,那么程序最后还是会直接跳到 输出错误提示,这样我们就无法更加细致的观察到寄存器中的值以及程序执行的变化,所以,我们应该在 jne 汇编指令稍微往前,提示 "输入flag吧:"这之间,下断点来观察寄存器的变化:
我们挑选 0xf1062 lea 这个取内存地址的汇编指令这里下断点,对应快捷键为 F2:
然后我们运行程序对应快捷键 F9(将程序用 OD 打开只是加载程序,没有运行),输入比较明显的值,比如 aaaaaa ,然后回车,程序将运行到 lea 汇编指令下断点的位置,然后 F8 单步步过(单步步过的意思是遇到 call 指令直接路过,而不进入API里面):
根据信息窗口可以推测,程序先是将我们的 aaaaaa 放入了 eax寄存器,然后将正确 flag 放入了 ecx 寄存器,然后进行比较;
下面是一些常用快捷键总结:
- F2 设置或者取消无条件断点
- Ctrl +G 显示指定内存地址中的数据
- F7 单步步进,遇到 call 指令跟进(进入API内部)
- Ctrl +F7 重复按F7(重复单步步进)直到按 ESC ,F12 或者遇到断点时停止
- F8 单步步过 ,遇到 call 指令路过(不进入API内部)
- Ctrl + F8 重复 F8,直到按ESC,F12 或者断点时停止
- Ctrl + F9 直到遇见 ret 指令停止
- Alt + F9 若进入系统领空,此命令可以瞬间回到应用程序领空
- F9 运行程序(遇到断点停止)
- 双击 EIP 寄存器 让光标回到当前EIP 所指向的语句
- 减号 - 回看指点单步跟踪的代码
- Alt + B 打开断点窗口(在这里可以看见程序中所有的断点)
- F4 执行到当前光标所选中的指令
- Ctrl + F2 重新载入程序(不是运行)
使用OD 分析程序一般步骤:查找特殊字符串或者API,下断点,运行,跟踪调试;可以结合IDA静态分析工具使用。