首先,我们检查一下程序开了哪些缓解措施
|
接着,对程序作了简单的逆向,发现了几处漏洞点:
- 在获取
author
时,没有用\x00
截断,因为author
和pages ptr
相邻,若pages[0]
已经有数据,则会泄漏堆的指针 - 在
edit
的时候也没有使用\x00
截断,导致可能错误的计算size
,越界写 - 因为
pages
最多含有8个元素,而在add page
的时候错误的判断if ( i > 8 )
导致第九个page
的指针会覆盖掉page[0]
的size
我们输入在author
输入0x40
长度的字符串,然后add
添加一个0x18
大小的page[0]
,填充18
字节的数据。调用info
则会将heap
指针打印出来。这里选择0x18
的原因是因为分配堆的时候16
字节对齐,最后8
字节会占用下一块的PREV_SIZE
。
然后,edit
编译pages[0]
,再输入0x18
个字符,因为strlen
错误的计算的长度,此时pages[0]
的size
为strlen(0x18 + strlen(top_chunk_size))
。
|
接着,我们就可以继续edit
来编辑top chunk
的大小了。将top chunk
的大小改成0xfe1
。因为函数里调用了scanf
,且scanf
会分配0x1000
大小的堆且不回收,且0x1000 > 0xfe1
。所以,在函数结束后,系统会把top chunk
放入unsorted bin
里。
我们继续使用edit
来编辑pages[0]
,这时,输入\x00
来使得pages[0]
的size
为0,绕过add
时候的检测,用来添加pages[8]
,完成指针覆盖pages[0]
的size
。
|
接着,我们添加pages[1]-pages[8]
,每个都输入8个字节,这里是为了将unsorted bin addr
也就是main_arena + 0x58
打印出来(因为此时我们分配的内存都是从unsorted bin
切分出来的)。我们可以通过view pages[3]
来得到main_arena + 0x58
的地址。此时,我们就可以得到libc
的基址了。
此时,pages[0]
的size
已经是堆的地址了,就可以使用edit
越界写其他数据了,也可以写unsorted bin
的FD
和BK
,即可以利用FSOP
来完成利用。
我们需要把unsorted bin
用以下内容覆盖
|
之后再分配一块内存就会执行system(/bin/sh)
,我们来看下面分析。
首先,_IO_list_all
的结构如下
|
在分配一块内存时,首先会从unsorted bin
中拆下来一块。
|
此时,_IO_list_all
已经被改写成了main_arena+0x58
。所以_IO_list_all
已经变成了如下内容
|
然而,main_arena + 0x58 + 0x60
是small_bin[4]
的FD
和BK
。又因为,分配内存时,由于unsorted bin
的大小已经被我们改写成了0x61
,所以会先把unsorted bin
加入small_bin[4]
,所以此时_IO_list_all->_chain
指向的内容已经是我们可以控制的了。
_IO_list_all->_chain
还是部署一个FILE
结构体(此时,这里已经变成unsorted bin
)
|
所以,要执行_IO_OVERFLOW(fp, EOF)
必须要满足两点
fp->_mode <= 0
fp->_IO_write_ptr > fp->_IO_write_base
所以,需要满足unsorted bin + 0xC0 <= 0
且unsorted bin + 0x28 > unsorted bin + 0x20
,又因为_IO_OVERFLOW
在vtable + 0x18
处,所以要将vtable + 0x18
改为system
的地址。
因为在分配的时候,unsorted bin -> BK = _IO_list_all - 0x10
,检测到victim->size=0
,会触发异常,flush
所有的IO
流。
|
后面的执行链malloc_printerr -> _libc_message -> abort -> _IO_flush_all_lockp -> _IO_OVERFLOW
。导致执行system(/bin/sh)
。
|
REFER
http://www.freebuf.com/articles/system/151407.html
https://www.cnblogs.com/shangye/p/6268981.html
http://4ngelboy.blogspot.com/2016/10/hitcon-ctf-qual-2016-house-of-orange.html