[ZJCTF 2019]EasyHeap
使用checksec查看:

一道堆题,关闭了PIE,可以考虑覆盖got表来获取system getshell
拉进IDA中查看:
标准的菜单,main()函数就不贴截图了,menu()函数也没有营养,图也不贴了,
先来看看create_heap():

- heaparray[i]:存放 chunk 的地址。
- read_input(heaparray[i], size):向 chunk 写入 size 大小的内容。
- heaparray是存放在bss段上的
edit_heap():

read_input(heaparray[v2], v0);
- read_input(heaparray[v2], v0):向 chunk 中写入 v0 大小的内容,也就是说如果 v0 比 create 时的 size 大的话就会造成堆溢出。
delete_heap():

free(heaparray[v1]);
heaparray[v1] = 0LL;
- free(heaparray[v1]); free 掉对应 chunk
- heaparray[v1] = 0LL; 将指针置 0 。
- 不存在UFA
值得一提的是这道题目还有个函数:l33t():

这个函数直接能返回flag,但是实际上并不存在这个目录:

OK,回到题目上来,指针被清空了,UAF啥的就用不了了,但是可以注意到的是,存在堆溢出,且堆是放在bss段上的
最先想到的便是unlink,PIE保护也没有开启,正好可以修改free的got表.
首先针对每个函数写出对应的函数:
def add(size,content):
r.recvuntil("Your choice :")
r.sendline('1')
r.recvuntil("Size of Heap : ")
r.sendline(str(size))
r.recvuntil("Content of heap:")
r.sendline(content)
def edit(idx, size, content):
r
利用堆溢出与未初始化指针漏洞获取系统 shell

该博客详细介绍了如何利用[CTF]比赛中的一道题目,该题目涉及到堆溢出和未初始化的堆指针。通过关闭的PIE保护,作者通过构造fake_chunk来影响堆布局,进而修改free的GOT表,最终实现通过free调用system('/bin/sh')获取shell。整个过程包括创建、编辑和释放堆块,以及构造payload来操纵内存地址。
最低0.47元/天 解锁文章
2978





