houseoforange_hitcon_2016
先检查保护
保护全开
FSOP:对于_IO_FILE_plus结构体的利用
首先,在分析这个题目之前,我们需要知道两个知识点,一个是_IO_FILE_plus,一个是FSOP
_IO_FILE_PLUS
_IO_FILE_plus是ptmalloc中定义的一种结构体,他决定了很多东西,先在gdb里面查看一眼
在此,我们就用本次题目中会使用到的_IO_list_all结构体来作为参考。
_IO_FILE_plus 主要是由两个部分组成,其中一个是_IO_FILE,另外一个是vtable。
_ I O _ F I L E _ p l u s = _ I O _ F I L E + v t a b l e \_IO\_FILE\_plus = \_IO\_FILE + vtable _IO_FILE_plus=_IO_FILE+vtable
_IO_FILE
_IO_FILE里面存了很多东西,这里有很多利用方式,比如说,
将_FLAGS = 0xfdab2887(或者说其他的值也行)
程序会将_IO_write_base = 0x80 以及 _IO_write_ptr之间的值打印出来
假设将_IO_write_base = 0x80 _IO_write_ptr = 0xa0 就会将把下图之中1到0xfffffffffff之间的值打印出来。
这是一种暂时与本题无关的泄露方式。
看回本题,
在_IO_FILE之中, _ chain是用来存储下一个_IO_FILE_PLUS指针的值,在malloc之中,如果产生错误,就会利用这一特性调用,最终来到 _IO_flush_all_lookup处,这个地方是用来打印错误信息的。这个地方有漏洞,对于_IO_FILE_PLUS结构体
-
_mode == 0
-
_IO_vtable_offset == 0
-
_IO_write_ptr > _IO_write_base
当满足以上条件的时候,会调用 _IO_OVERFLOW函数,并且将_chain里面那个结构体作为第一个函数传入,
所以我们的利用思路,就是将**_IO_OVERFLOW**函数修改为system,将结构体的第一个位置改为"/bin/sh"这样的话就能getshell
vtable
vtable也是一个结构体
对于前文提到的_overflow就在这个地方(当然只是个人感觉)
所以这个也比较明确了,就是将vtable这一段修改为system。
函数分析
main()