参考: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. Windows 查看硬盘ID(diskpart命令)

    使用diskpart命令Win+R键运行cmd,进入命令行界面:1.diskpart2.list disk 查看有几块硬盘3.select disk 0 选择第一块硬盘4.detail disk 显示 ...

  2. PHP移动互联网开发笔记(8)——MySQL数据库基础回顾[2]

    一.数据表 为了确保数据的完整性和一致性,在创建表时指定字段名称,字段类型和字段属性外,还需要使用约束(constraint),索引(index),主键(primary key)和外键(foregin ...

  3. apt-get install安装软件时出现依赖错误解决方式

    在使用apt-get install安装软件时,常常会遇到如上图所看到的错误.该错误的意思为缺少依赖软件.解决方式为: aptitude install golang-go

  4. Qt 通过绘画设置边框阴影

    首先widget设置 setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground, true) ...

  5. 【转】Boost.Python

    http://edyfox.codecarver.org/html/boost_python.html Boost.Python 是 Boost 中的一个组件,使用它能够大大简化用 C++ 为 Pyt ...

  6. iOS9.0 生成证书流程一(非推送)

    1.首先进入网址 http://developer.apple.com 2.第二登入,点击  

  7. 【BZOJ 1024】 [SCOI2009]生日快乐

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1024 [题意] [题解] 要求恰好分成n个部分;每个部分的面积都一样; 则dfs的时候 ...

  8. padding百分百值是相对谁的百分比

    先看代码 <head> <meta charset="UTF-8"> <title>Document</title> <sty ...

  9. 一个里程碑,新网站实现全站https

    本地验证node服务没问题后,上传到阿里云服务器上,发现无法访问.一开始以为是SSL证书有问题,去腾讯云SSL证书重新下载,还是不行.然后改node应用文件代码app.js,猜测是crt证书应该改成p ...

  10. Java入门程序

    JavaC.exe 编译器,编译.java文件 Java.exe 解释器,执行class文件 编译命令  javac HelloWorld.java 编译后 会产生同名的.class文件 javac编 ...