想要进行缓冲区溢出的分析与利用,当然就要懂得程序运行的机制。今天我们就用动态分析神器ollydbg来了解一下在windows下程序是如何运行的。

戳这里看之前发布的文章:

缓冲区溢出实战教程系列(一):第一个缓冲区溢出小程序:https://www.freebuf.com/articles/system/195614.html

缓冲区溢出实战教程系列(二):dev c++编译汇编代码:https://www.freebuf.com/articles/system/197116.html

0×00 OD基本介绍及用法

1. OD界面

我们将程序拖入OD中,会出现如下界面,在这里我分为四个主要区块,分别是汇编代码窗口、寄存器窗口、二进制窗口、堆栈窗口。当然也有分为五个区块的,但没有太大区别。接下来我给大家讲讲有个基本概念。等下在程序分析里给大家具体做讲解。

2. OD常用操作

F2:设置断点

F4与F9:F4是运行到光标位置,F9是运行到断点处

F7与F8:F7是单步步入,F8是单步步进

Ctrl+F9:是从F7步入的代码段中返回之前代码段

0×01 寻找程序入口

1. 程序介绍

今天拿MessageBox的代码为例,先贴出代码:

#include<windows.h>
int main()
{
MessageBox(0,"You have been hacked","warning",0);
return 0;
}

可以看出这是一个非常简单的弹出提示框的代码,只有5行代码。但麻雀虽小五脏俱全,通过一个小程序我们更容易理解程序的基本运行原理。

2. OD分析程序起点

将程序拖入到OD:

我们会看到程序停在了0x004014E0的位置,但这不是程序真正的入口。通常用OllyDBG打开一个程序之后,并没有直接跳到程序主函数入口地址,而是在进行一些初始化工作。这个我们暂时不用管我们这里只要找到主程序入口就好。

一般用OllyDBG打开程序的时候,并不是直接定位到程序入口,而是还要先进行一系列的初始化工作,但做这些工作的反汇编代码我们是不需要的,所以我们要快速跳 过,直接到程序入口。

3. 程序真正入口点

找程序入口呢一个是凭经验一路F8,还有一个就是借助工具,今天跟大家说一下利用IDA找程序入口。

在IDA中打开程序,在左侧栏中找到_main,点击右侧代码栏第一行,看底下的地址就好了。我们记住入口地址就好。

main函数地址是0×00401500。

我们回到OD,右键goto-expression跳转到main函数所在位置。

我们按F2在这设个断点,接下来我们要用到。

0×03 主函数运行过程

我们在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时栈的变化了,也就是真正栈的知识了,希望大家能够打好基础。

缓冲区溢出实战教程系列(三):利用OllyDbg了解程序运行机制的更多相关文章

  1. 缓冲区溢出实战教程系列(二):dev c++编译汇编代码

    小伙伴们对我上一篇文章的反应完全出乎了我的意料,感谢大家对我的支持和认可.接下来我会精心的把这一系列课程设计好,尽量详细的展示给大家.上篇文章我列举了一个缓冲区溢出的小例子,并提到了dev c++.o ...

  2. 「软件测试实战教程系列(三)」弃繁就简,接口测试神器Postman|收藏版

    软件测试实战教程系列(三)弃繁就简,接口测试神器Postman|收藏版 Postman主要帮我们干了三件事: 1.把相关集合放到一个集合当中方便管理. 2.对指定接口发送请求. 3.断言 下面我们使用 ...

  3. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  4. Netty4.x中文教程系列(三) ChannelHandler

    Netty4.x中文教程系列(四)  ChannelHandler 上一篇文章详细解释了Hello World示例的代码.里面涉及了一些Netty框架的基础. 这篇文章用以解释ChannelHandl ...

  5. WCF入门教程系列三

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  6. CSAPP阅读笔记-变长栈帧,缓冲区溢出攻击-来自第三章3.10的笔记-P192-P204

    一.几个关于指针的小知识点: 1.  malloc是在堆上动态分配内存,返回的是void *,使用时会配合显式/隐式类型转换,用完后需要用free手动释放. alloca是标准库函数,可以在栈上分配任 ...

  7. JVM系列(三):java的垃圾回收机制

    java垃圾回收机制介绍    上一篇讲述了JVM的内存模型,了解了到了绝大部分的对象是分配在堆上面的,我们在编码的时候并没有显示的指明哪些对象需要回收,但是程序在运行的过程中是会一直创建对象的,之所 ...

  8. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  9. struts2官方 中文教程 系列三:使用struts2 标签 tag

    避免被爬,先贴上本帖地址:struts2 官方系列教程一:使用struts2 标签 tag http://www.cnblogs.com/linghaoxinpian/p/6901316.html 本 ...

随机推荐

  1. Vue.js-----轻量高效的MVVM框架(三、认识数据绑定)

    插值 1.文本插值 (1)双向数据绑定 v-model="msg0101",一旦v-model中的数值发生变化,所有用vue表达式{{msg0101}}的数据都会更新. (2)单次 ...

  2. spark项目打jar包,不包含依赖包问题的解决方案

    mvn clean package打包maven-archetype-webapp项目时,打包后的jar包含项目中引用的jar包(解压后,在WEB-INF有一个lib目录,该目录下有所有依赖包). m ...

  3. c++ 封装线程库 1

    1.Pthread条件变量简介 条件变量也是线程间同步一个重要的内容,如果说互斥是一个种竞争关系,那么条件变量用于协调线程之间的关系,是一种合作关系. 条件变量的应用很多,例如:BlockingQue ...

  4. VSCode创建自定义用户片段

    1.选择相应的用户片段类型(以"Java"为例) 首选项 -> 用户代码片段 -> java 2.设置模板 prefix 触发快捷提示的字符串前缀 body 代码片段主 ...

  5. Transform控制的物体移动

    Transform控制的物体移动:public class TKMove : MonoBehaviour { public float HSpeed; public float VSpeed; pri ...

  6. ASP.NET中多语言的实现

    一个网站可能具备多个语言,要实现这个功能在ASP.NET中是非常简单的.我们需要为项目添加资源文件文件夹,并且添加针对网站的特定的资源文件等即可.在ASP.NET中资源文件分成两类:全局和页面级(即“ ...

  7. pat1046. Shortest Distance (20)

    1046. Shortest Distance (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...

  8. 项目中使用的spring 注解说明

    以前在项目中spring 的依赖注入使用 xml 配置,现在使用 注解(Annotation) 来实现配置. 1声明bean 1.1实例 有类: public class MyBean{ //do s ...

  9. [转]ASP.NET Core集成微信登录

    本文转自:http://www.cnblogs.com/early-moon/p/5819760.html 工具: Visual Studio 2015 update 3 Asp.Net Core 1 ...

  10. 文件夹选择之FolderBrowserDialog控件

    应用程序可能只允许用户选择文佳夹而非文件,例如在播放MP3时,用户可能把所有的MP3放在一个文佳夹内,在添加时,只要选择添加这个文佳夹,将会把在这个文件内的所有MP3添加的播放器里.在这里对播放器来说 ...