babyheap_0ctf_2017
使用checksec查看:

保护全开,看到PIE的时候就想到需要泄露libc_base_addr了
拉进IDA中看吧:

一个死循环,主要功能Allocate、Fill、Free、Dump,这边我已经修改函数名了,接下来一个一个看
首先是创建堆:

最多创建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

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

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



