例行检查
保护全开,分析程序逻辑。发现没有输出堆内容的函数,想要泄露libc地址只能通过修改IO_FILE结构体实现。realloc函数有两个trick。在size为0时,free掉指针指向的堆块,返回0;在分配超过当前指针指向堆块大小时如果有剩余空间则扩大堆块大小。
利用思路
1.堆块free 8次放进unsortbin中,在fd上得到arena地址,通过realloc扩大堆块的特性造成堆块堆叠,就可以修改到fd部分,由于_IO_2_1_stdout_与arena只相差4位,且低三位已知,剩余一位可以爆破,概率1/16。于时可以分配到_IO_2_1_stdout_。修改flag位,且把write_base调低,下次在调用输出函数时会将libc中地址输出出来。
2.得到libc之后就可以将free_hook改为one_gadget从而getshell。
from pwn import *
libc=ELF('./libc-2.27.so')
def realloc(size,data):
io.recvuntil('>> ')
io.sendline('1')
io.recvuntil('Size?')
io.sendline(str(size))
io.recvuntil('Content?')
io.send(data)
def free():
io.recvuntil('>> ')
io.sendline('2')
def pwn()
RoarCTF 2019 Realloc Magic:堆溢出漏洞利用分析

本文详细分析了RoarCTF 2019中的一个名为`realloc_magic`的挑战,重点讨论了如何在保护全开的情况下,利用`realloc`函数的两个技巧:size为0时释放内存和扩大堆块。通过精心设计的堆块操作,修改`IO_FILE`结构体,以泄露libc地址。首先,堆块被free多次进入unsorted bin,然后通过调整堆块大小来修改fd字段,进而找到arena地址。利用概率计算,定位到`_IO_2_1_stdout_`,篡改标志并调整`write_base`,迫使输出函数泄漏libc地址。最后,一旦获得libc,通过修改`free_hook`为one_gadget gadget,实现获取shell的目标。
最低0.47元/天 解锁文章
2296

被折叠的 条评论
为什么被折叠?



