SEED缓冲区溢出实验笔记——Return_to_libc
参考: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的更多相关文章
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...
- 2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验
seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our tas ...
- Kali学习笔记33:Linux系统缓冲区溢出实验
之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...
- Kali学习笔记21:缓冲区溢出实验(漏洞发现)
上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...
- 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验
2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...
- 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验
2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...
- 使用Linux进行缓冲区溢出实验的配置记录
在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...
- 20191310Lee_yellow缓冲区溢出实验
缓冲区溢出实验 1.什么是缓冲区溢出 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据 ...
- Kali学习笔记20:缓冲区溢出实验环境准备
在前几篇的博客中:我介绍了OpenVAS和Nessus这两个强大的自动化漏洞扫描器 但是,在计算机领域中有种叫做0day漏洞:没有公开只掌握在某些人手中 那么,这些0day漏洞是如何被发现的呢? 接下 ...
随机推荐
- Android 长按事件和短按事件同时响应
在长按事件中的return false 改为return true就可以解决这个问题
- 判断系统64位(使用GetNativeSystemInfo函数,XP时代就有这个函数了)
判断系统64位 static bool IsWin64 (void) { SYSTEM_INFO si = {0}; typedef void (WINAPI *LPFN_PGNSI)(LPSYSTE ...
- C语言编写静态链接库及其使用
本篇讲述使用C语言编写静态链接库,而且使用C和C++的方式来调用等. 一.静态库程序:执行时不独立存在,链接到可执行文件或者动态库中,目标程序的归档. 1.用C编写静态库步骤 a.建立项目(Win32 ...
- 【27.48%】【codeforces 699D】 Fix a Tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- wpf设置设计时的ViewModel
原文:wpf设置设计时的ViewModel wpf mvvm开发中,有些情况下,你的view不一定设置DataContext,但是你又想在设计阶段,能够自动提示你的view绑定的viewmodel的内 ...
- 使用Toast进行用户提醒(转)
Toast是Android提供的一个轻量级的用户提醒控件,使用也很简单,就相当一个极简的dialog!!!下面将向您介绍一些Toast的详细用法: 1.普遍使用的方法: Context context ...
- UVALive 6531 Go up the ultras 单调栈+RMQ
题目链接:点击打开链接 题意: 给定n座山 以下n个数字表示n座山的高度 若这座山u合法,则要满足: 1.若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座 ...
- 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
javascript 是可以运行在网页前端的脚本语言,可以基于 html 之上实现更丰富的交互(网页内容的交互显示).异步回调.多线程.定时器.动画等. hello_world.html <ht ...
- 论题Cascade Object Detection with Deformable Part Models一个怀疑
该文的作者是Pedro F. Felzenszwalb等一下,著名DPM在目标检测模型.本文的工作是DPM(变形组件模型)级联,以加快检测速度. 加速的方式,现在其次是计算总结成绩的某些部分,假设小于 ...
- MyEclipse使用汇总——MyEclipse10设备SVN插入
一.下载SVN插件subclipse 下载地址:folderID=2240" style="color:rgb(7,93,179)">http://subclips ...