RCTF2019 pwn ManyNotes writeup
TOC
一道典型的House of Orange by thread
题目。
源程序、相关文件下载:many_notes.zip 。
溢出点
void __fastcall exploit_sub_B0B(char *str, size_t length) |
这里存在堆溢出,但是整个函数并没有free
函数,则需要我们使用到House of Orange by thread
漏洞。
思路
House of Orange by thread
得到一块tcache chunk
heap overflow
修改top chunk
的sizeheap overflow
修改tcache chunk
的fd
tcache chunk
for i in range(8): |
这里需要把chunk
变得足够小,这样才能放入到tcache
中。
pwndbg> bin |
我们可以看到,top chunk
被free到了tcache
中。
原本top chunk
不够的话,是继续向后扩展,但是如果大小达到0x4000000
,则会free掉top chunk
,并向前扩展。
pwndbg> vmmap |
如上所示,0x7fb094000000-0x7fb094023000
就是向上扩展的新的heap
。
修改 top chunk 的size
我们继续malloc
的话,top chunk
会继续向后扩展,直到遇到了我们之前的heap
,原本程序在要撞到之前的heap
的时候,会free
掉top chunk
并继续向前扩展。但此时我们可以直接修改top chunk 的size
,那么top chunk
就会和原先的heap
重叠,这样我们就可以溢出到之前的tcache
。
for i in range(17): |
在这里面,0x0000000000000be1
为原本的top chunk
的size,然后我们对他进行扩展,加上0x3fff000
(也就是后面的heap大小)。
然后继续向后进行top chunk
扩展,我们很快就会到之前的tcache
那里。
for i in range(8): |
修改 tcache chunk 的fd
heap overflow
修改tcache chunk
的fd。
new(0x1b00, 0, ['d' * (0x1b00 - 0x10), 'e' * 0x100 + p64(0) + p64(0xd1) + p64(libc_base_addr + libc.symbols['__malloc_hook'])]) |
从下面可以看到,我么已经拿出了__malloc_chunk
这个地址。
pwndbg> bin |
接下来把它修改成one_gadget
。
# You need to calculate the value by your own environment. |
从下面可以看到,__malloc_chunk
已经被修改成了我们想要的值。
pwndbg> p __malloc_hook |
完整代码
#!/usr/bin/python2 |
该段代码虽然并不能打通本地,结果下面所示:
Thread 2 "many_notes" received signal SIGSEGV, Segmentation fault. |
官方的解题思路就是这样的,至于打不通本地,原因可能是靶机的glibc是2.26
版本的,但我的物理机是2.27
版本的。
总结
这是一道要花费很多时间去调试的题目,由于是thread_arena
,所以每一个chunk的地址都需要自己手动来确定其位置。