想要进行缓冲区溢出的分析与利用,固然就要懂得程序运行的机制。今天咱们就用动态分析神器ollydbg来了解一下在windows下程序是如何运行的。html
戳这里看以前发布的文章:c++
缓冲区溢出实战教程系列(一):第一个缓冲区溢出小程序:https://www.freebuf.com/articles/system/195614.htmlexpress
缓冲区溢出实战教程系列(二):dev c++编译汇编代码:https://www.freebuf.com/articles/system/197116.html小程序
0×00 OD基本介绍及用法windows
咱们将程序拖入OD中,会出现以下界面,在这里我分为四个主要区块,分别是汇编代码窗口、寄存器窗口、二进制窗口、堆栈窗口。固然也有分为五个区块的,但没有太大区别。接下来我给你们讲讲有个基本概念。等下在程序分析里给你们具体作讲解。ide
2. OD经常使用操做函数
F2:设置断点工具
F4与F9:F4是运行到光标位置,F9是运行到断点处spa
F7与F8:F7是单步步入,F8是单步步进.net
Ctrl+F9:是从F7步入的代码段中返回以前代码段
今天拿MessageBox的代码为例,先贴出代码:
#include<windows.h> int main() { MessageBox(0,"You have been hacked","warning",0); return 0; }
能够看出这是一个很是简单的弹出提示框的代码,只有5行代码。但麻雀虽小五脏俱全,经过一个小程序咱们更容易理解程序的基本运行原理。
将程序拖入到OD:
咱们会看到程序停在了0x004014E0的位置,但这不是程序真正的入口。一般用OllyDBG打开一个程序以后,并无直接跳到程序主函数入口地址,而是在进行一些初始化工做。这个咱们暂时不用管咱们这里只要找到主程序入口就好。
通常用OllyDBG打开程序的时候,并非直接定位到程序入口,而是还要先进行一系列的初始化工做,但作这些工做的反汇编代码咱们是不须要的,因此咱们要快速跳 过,直接到程序入口。
找程序入口呢一个是凭经验一路F8,还有一个就是借助工具,今天跟你们说一下利用IDA找程序入口。
在IDA中打开程序,在左侧栏中找到_main,点击右侧代码栏第一行,看底下的地址就行了。咱们记住入口地址就好。
main函数地址是0×00401500。
咱们回到OD,右键goto-expression跳转到main函数所在位置。
咱们按F2在这设个断点,接下来咱们要用到。
咱们在0×401500处下好断点,按F9运行到断点处。当咱们看见地址的字成红色背景变为黑色时,就说明程序已经运行到咱们的断点处了。
找到主函数咱们今天的任务就完成一半了,咱们先分析一下主函数运行的过程,其实主函数运行过程也是压栈弹栈的过程,只是这个过程与咱们直接调用MassageBox的堆栈调用略有不一样,为了方便理解先看一下下面的小知识点。
栈顶(esp):栈的低址,就是栈空间地址小的一端
栈顶(ebp):栈的高址,就是栈空间地址较大的一端
栈空间的增加:由高地址向低地址增加(ebp—>esp)
好让咱们继续,先F8运行到0x40150B。
这时咱们要观察一下如今栈顶和栈底的状况这时候esp栈顶是0x28FEB8,ebp栈底是0x28FF88。
继续F8两次,这里就出现了与调用函数不一样的地方,这里指令SUB ESP,14是让esp直接减14的意思,咱们如今的esp是0x28FEB4。
果断打开计算器0x28FEB4-0×14=0x28FEA0,那说明我执行完这个指令事后esp的值就应该是0x28FEA0。
让咱们F8验证一下,果真不出所料,目前栈顶的位置就是 0x28FEA0。
记住这里都是16进制的运算因此0×14是10进制的20,而每一个地址相差4,也就是栈顶到栈底一会儿多了5个地址,但没有赋值,这里也就是跟咱们平时说的压栈的方式不同的地方。通常而言压栈是一个一个从高址向低址入栈。这里我先把它称为开辟栈空间而后赋值吧。
继续F8,不过这时咱们要观察开辟出的5个地址值得变化,咱们先截图记录一下:
当咱们运行过CALL 00401EA0时发现这五个地址的值没有变化。
当咱们运行过MOV DWORD PTR SS:[LOCAL.4],0时咱们发现0x28FEAC的值变成了0。
接着运行MOV DWORD PTR SS:[LOCAL.5],OFFSET 0×404000 ,这时0x28FEA8的值变成了0×404000。
接着运行 MOV DWORD PTR SS:[LOCAL.6],OFFSET 0×404008,这时0x28FEA4的值变成了0×404008。
接着运行 MOV DWORD PTR SS:[LOCAL.7],0 ,这时咱们的esp变成了0。
这些就是主函数中在运行MassageBox以前栈中的变化,只不过这里是利用esp-14的方法先开辟了个空间而后再入栈。
这里再补充一下0×404000和0×404008 是什么,其实在截图里咱们已经看到OD已经给出了,它们分别表明warning和You have been hacked。那它们是怎么来的呢?其实咱们在程序编译的时候已经把这些变量集中放到了数据段,这涉及到PE结构了,你们目前理解为变量值集中存放的地方。好咱们验证一下,在左下角二进制窗口依次右键—>go to—>expression接着在弹出窗口中输入404000,查找,咱们看下结果:
咱们在看一下warning在线经过工具转换成ASC码的结果,恰好与上图前七个字节对上。
以上说明0×404000和 0×404008这样的地址就相似高级语言里的变量,咱们把真正的值赋给变量,而后咱们只操做变量就行了。
以上就是今天讲的内容,你们跟着步骤仔细操做一下,要否则后边的就会越听越迷糊。下篇文章就要真正讲到调用MassageBox时栈的变化了,也就是真正栈的知识了,但愿你们可以打好基础。