Single

_IO_vtable_check指针劫持(house of fmyy)

漏洞利用链

puts()->_IO_vtable_check()->_dl_addr()

漏洞利用背景

众所周知,在2.27及以上的glibc中,常规劫持IO_vtable指针实现劫持RIP的方式不再适用

由于_IO_vtable_check的存在,虚表劫持变得更加困难

2.27版本可以使用IO_str_overflow等方式绕过,2.31及以后的版本则是产生了大量的house系列,如:pig banana emma等等

到了2.35,_IO_file_jumps变得不再可写,在这种情况下,需要新的方法来进行劫持

漏洞利用方法

并不仅仅限于puts函数,任意调用IO_vtable的地方都可使用

将_IO_2_1_stdout_+0xd8处修改为任意不合法数字

进入_IO_vtable_check函数

进入_dl_addr函数

而在_dl_addr函数中,则会进行一次函数指针的调用

而这个指针位于__rtld_global结构体上,该指针在低版本libc中也曾作为exit_hook被劫持

同样的,其rdi也指向__rtld_global结构体上某个偏移处,因此可以实现同时控制rdi和rip

漏洞总结

将任意IO指针的vtable修改触发_IO_vtable_check,修改__rtld_global+0xf90为gadget即可利用

任意地址写可以触发,任意地址写任意值可以利用

和house of husk比的优势是可以ROP,缺点是要任意地址写任意值不能是写堆地址

暂时还没见过有人用这个利用方法,那就管他叫house of fmyy好了

补充

__rtld_global+0xf98处还有一次调用

多写8个字节劫持两次RIP,找个magic_gadget有可能实现ROP

暂无评论

发表评论