漏洞利用链
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
暂无评论