hitcontraining_heapcreator--简单堆利用
BUUCTF-hitcontraining_heapcreator
glibc2.24
很明显的堆菜单题目
- menu
- create_heap
- delete_heap
- edit_heap
- show_heap
分析:
- 各个功能块都展示完了,发现在edit_heap有一个**off_by_one漏洞,那么我们可以修改下一个chunk的size**
- 将其free掉,再add回来,就可以修改chunk的内容,注意到show_heap是一个**%s + 地址**,那么我们将其填入free_got,就可以得到free的真实地址,从而泄露libc,获得system,但是光system不够啊。
- 再注意到delete_heap,是free(地址),我们将free_got -> system,再在那个地址填入b’/bin/sh\x00’,就可以getshell了
- 具体思路就这些了,来看gdb调试的:
gdb调试
1.申请三次chunk
1 | add(0x18,b'aaaa') # 0 -> 2个chunk |
- 调用了三次create_heap,有6个chunk,看看其内容是什么
可以猜测,相比于正常的chunk结构,这里前面多了一个chunk的结构体,记录了其size和user_data_address
1 | struct heap{ |
2.利用off_by_one修改size
1 | payload = b'/bin/sh\x00' + p64(0)*2 + p8(0x81) |
- 从箭头处,也就是data处填入数据,往heaparray[0]处地址写入/bin/sh,修改chunk1结构体size,使得下方0x70的内容被合并为一个chunk,之后的free和malloc都会被当成一个chunk处理
3.add修改show部分的地址为free_got,泄露libc
1 | 此时1,2合并,修改2号chunk_data为free_got,show出来泄漏真实地址 |
- 对于chunk2,也就是heaparray[2]来说,它的内容已经更改,show的时候就是show(0x602018),也就是将free_got指向的内容给输出出来,也就是输出free的真实地址
- 此时的heaparray内容如上,因此show可以将free真实地址show出来
4.修改free_got->system,然后执行free
1 | # 修改free_got->system |
完整EXP
1 | from pwn import * |
总结:
- 在分析各个功能块的时候就要有想法,简单堆题一定要对地址掌握收悉。
- 标题: hitcontraining_heapcreator--简单堆利用
- 作者: D0wnBe@t
- 创建于 : 2024-08-31 20:15:38
- 更新于 : 2024-08-31 22:06:53
- 链接: http://downbeat.top/2024/08/31/hitcontraining-heapcreator-简单堆利用/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论