参考:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/

     http://drops.wooyun.org/tips/6597

     Bypassing non-executable-stack during exploitation using return-to-libc by c0ntex | c0ntex[at]gmail.com

     ROP轻松谈

     《程序员的自我修养》(虽然我没看完,但是对于理解这一切很有帮助)

在已经了解了缓冲区溢出的基本原理后,使用R2Libc方法需要获得最关键三个参数:system()、exit()、“/bin/sh”的地址,其中system()和exit()是libc.so中的函数,我们想要调用system并传入“/bin/sh”,并且返回到exit()的地址正常退出,以免留下错误日志。

要取得字符串的地址,教程中给出了一个方法,即通过自己程序的环境变量的地址来寻找漏洞程序的SHELL环境变量地址,因为他们的地址相近。但是程序的环境变量地址往往难以猜测,不如利用libc.so里的字符串,采用gdb如下指令可以查找到该地址。其中0xb7e5f430是system的地址。

通过反汇编正常的system()调用(自己写一个例子程序),可以从下图看出,是将参数字符串”/user/bin”的地址入栈来进行传递参数的。调用完system()后,程序同样会返回。正常调用函数是使用call命令,该命令首先将下一条指令的地址入栈,然后再跳转至目标地址执行。所以,我们在让程序的eip直接指向system()时,需要构建所谓的“伪栈”(fake frame)才能让溢出正常的进行,即栈让中依次存储”/usr/bin”地址、返回地址(exit()的地址)。esp指向的是返回地址。如图所示。为什么是这样的呢?其实,在溢出之后,对比参考图(b)就容易知道,上述要求的栈结构和调用call命令之后是一样的,故所谓的fake frame就完成了;而我们溢出是直接让eip指向了system,没有调用call。需要注意,溢出让ebp原来的值丢了,破坏了栈帧的结构。

下面来看一看细节。反观我们溢出后程序的栈,在执行leave、ret命令后,ebp变为原值,esp指向原来的参数位置。通过调试溢出的程序,发现程序转到system()地址后,没有像一般函数那样push ebp,所以esp继续指向0xbfffff200地址,即溢出前存放参数的位置。同样可以看到,0xb7e5f49b直接返回ret,并没有leave指令,而ret指令功能就是pop eip(这样的说法是否准确?),所以在调用完system()后eip会变成0xbfffff200存放的内容,故教程中的fake_ret位置是正确的。从0xb7e5f437指令可以看出,对参数的引用就是根据esp的偏移,将0xbffff204的内容放到了esi中。虽然ebp被我们“丢掉”了,但是system()没有用到ebp。

接着一步步的执行,会发现程序跳转到了不知名的地址0xb7e5ee70中,并且再也不会回到之前的f4**的地址,但是,最后仍然会使用0xaaaaaaaa返回,即调用system()前设置的返回地址(过程中都发生了什么?)。但是,如果把system看做一个黑盒的话,这么做确实可以成功的攻击。

其实在实验的时候,我花了很久才理解为何这样构建所谓的fake frame是正确的。原因在于分析问题的粒度:我一步步汇编跟进了system函数,而没有从调用函数黑盒的角度来理解。这也算是走了弯路的收获吧。

漏洞程序代码:

By Ascii0x03

SEED缓冲区溢出实验笔记——Return_to_libc的更多相关文章

  1. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  2. 2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验

    seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our tas ...

  3. Kali学习笔记33:Linux系统缓冲区溢出实验

    之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...

  4. Kali学习笔记21:缓冲区溢出实验(漏洞发现)

    上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...

  5. 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...

  6. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

  7. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  8. 20191310Lee_yellow缓冲区溢出实验

    缓冲区溢出实验 1.什么是缓冲区溢出 ​ 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据 ...

  9. Kali学习笔记20:缓冲区溢出实验环境准备

    在前几篇的博客中:我介绍了OpenVAS和Nessus这两个强大的自动化漏洞扫描器 但是,在计算机领域中有种叫做0day漏洞:没有公开只掌握在某些人手中 那么,这些0day漏洞是如何被发现的呢? 接下 ...

随机推荐

  1. 动态获取server时间

    近期在做的这个项目要获取到后台的数据.然后使用html5绘制曲线.曾经都是在自己电脑上使用没有发现有什么不正常的地方,昨天连接同事的server发现有段数据怎么都对不上了,開始我还以为程序有问题呢,找 ...

  2. js如何实现页面跳转(大全)

    js如何实现页面跳转(大全) 一.总结 一句话总结: 1.location的href属性: js跳转主要是通过window的location对象的href属性,因为location对象本来就是表示的浏 ...

  3. Java实现的并发任务处理实例

    本文实例讲述了Java实现的并发任务处理方法.分享给大家供大家参考,具体如下: public void init() { super.init(); this.ioThreadPool = new T ...

  4. javascript 验证附件大小

    ///验证单个文件不能超过30M function onChangeFile() { ///定义布尔类型的返回结果,初始值为false(默认不超过30M) var sResult = false; / ...

  5. uitableview顶部多出20距离, UIScollView顶部多出64距离

    self.automaticallyAdjustsScrollViewInsets = NO;看 这个UIViewController的这个属性你就明白了,此属性默认为YES,这样UIViewCont ...

  6. react持续记录零散笔记

    根据 React 的设计,所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上,这种算法叫做 DOM diff 这些生命周期在深入项目开发阶段是非常重要的 ...

  7. webpack的单vue组件(.vue)加载sass配置

    在通过vue-cli安装了webpack-simple 后,就自动安装好vue-loader了,但此时若写了含有sass的.vue组件,运行npm run dev时会报错.此时,需要我们在webpac ...

  8. 人生不过一个字【Life is but a word】

    有人说,人生是一出悲悲喜喜的戏,是一首飘飘忽忽的歌,是一次上去又下来的登山运动,是一场明明灭灭的烟花……是的,有道理,但听起来,太玄虚:悟起来,太深远:做起来,太复杂.              我说 ...

  9. Android 平台下Cordova 调用Activity插件开发

    首先建立一个包名为package com.JiajiaCy.CallActivity; package com.JajaCy.CallActivity; import org.apache.cordo ...

  10. PLC中ST语言的几种程序流程控制语句

    ST语言是IEC61131-3中规定的5中标准语言之一,目前常用见品牌的PLC都支持这种语言(施耐德,AB可以直接选择创建该类型的程序段或者功能块,西门子的略微麻烦一点),ST语言的一个好处是移植性好 ...