【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的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例行检查
在这里插入图片描述保护全开,分析程序逻辑。发现没有输出堆内容的函数,想要泄露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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值