OllyDbg使用入门

TL;DR

  • ollydbg有官方的下载的版本,也有其它修改版,其中我们最常用的是吾爱破解版本的od,其插件较多,较为方便。后面的介绍也是基本以吾爱破解的版本为主。

    常用快捷键

  • f8单步步过
  • f7单步步入
  • f9运行,执行到下个断点
  • f2下断点
  • ctrl + g 跳转到指定地址
  • ctrl+f9执行到返回,遇到断点会停下

    一些常用的操作

  • 可通过双击汇编窗口注释区或者右键给汇编代码添加注释,方便自己后续阅读,这里有一个小技巧,可以通过ida的静态分析方法进行静态分析加注释

    小技巧

  • 主视图切换
  • 有时候在调试的时候,一直在循环里,如果想要跳出循环,这个时候鼠标点到下一个命令的执行处,f4即可,即运行到当前代码处
  • 在用vs较高版本编译程序测试溢出等的时候注意要关闭保护功能(如常见的dep以及aslr),在项目菜单的属性里面设置

  • 在跟踪调试的时候,我们关注的是每步执行过后寄存器的变化情况,这个时候观察寄存器的窗口,红色的表示是发生了变化的数据。
  • 在进行动态分析的时候,最好完整的分析一个栈的出入过程,加上注释之后,对代码分析有好处
  • 刚开始调试的时候,容易跑飞,这个时候注意观察左上角的提示框,回显示你的module,不要进去了什么kernel模块
  • 注意由于基本上我们使用的系统上数据或者代码都是小端存储的,所以在看反汇编代码的时候看到机器码的时候,一定要倒过来看
  • 通过菜单中的查看内存map,整个可执行文件结构在内存中的地址映射

    此外还有L可以查看log data信息,E查看可执行模块,B查看断点信息。
  • 在vc6编译的程序中,函数返回之前会有一句call _checkesp,这里会有一个checkesp函数的调用,来检查栈是否平衡,如果不平衡会出现如下的错误,我在这里做一个测试,在return语句之前加一条内联汇编push ebx,这样就破坏了栈平衡如下图所示
  • vc中函数的调用方式是cdecl,这种函数调用约定对参数的传递依靠栈内存,在调用函数前,将通过压栈操作将参数从右至左依次送入栈中,当函数返回的时候,需要将参数使用的空间回收,这里的回收指的是恢复esp寄存器的值到函数调用前的值,对于cdecl调用方式而言,平衡堆栈的操作是由函数调用方来做的,在这里也就是要由main()函数来做的,可以看到反汇编代码add esp,8就是用来平衡栈的。主要用于平衡上面的两个push操作。
  • 函数返回值通常保存在eax寄存器中,在c语言中,main()函数的返回值为0,即return0,因此xor eax,eax 就是对eax进行了清零操作。
  • windows系统下,对API函数的调用遵循约定是stdcall,对于stdcall而言,参数依然是从右向左依次入栈,而参数的平栈则是在api函数内部完成的,而不是在函数调用时候完成的。

    上图中可以看到在调用MessageBox()的时候,在retn指令后面加了一个10,10这里是十六进制,也就是十进制中的16,我们在为MessageBoxA传递参数的时候,每个参数是4字节,4*4=16个字节,因此retn 16除了有返回的作用外,还包含了add esp,10的作用。

    other

  • 在看雪上有人翻译了国外人写的<使用ollydbg从零开始cracking>,还是挺详细的介绍了od的使用,推荐阅读和动手跟一遍。
    https://bbs.pediy.com/thread-184679.htm

    Reference

  • OllyDbg 入门系列
    http://bbs.pediy.com/user-24467-3-1.htm
  • 拿几个ctf的简单题目练习一下
    https://github.com/lcatro/SISE_Traning_CTF_RE