house of cat
1 | __malloc_assert -> __fxprintf -> __vfxprintf -> locked_vfxprintf -> __vfprintf_internal -> [_IO_wfile_seekoff] (IO_wfile_jumps) |
触发条件:
- 伪造 vtable = IO_wfile_jumps+0x10
- 修改 top chunk -> P = 0,使 top chunk 不够分配
house of emma
1 | __malloc_assert -> __fxprintf -> __vfxprintf -> locked_vfxprintf -> __vfprintf_internal -> [_IO_cookie_write](IO_wfile_jumps) |
1 | ► 0x7fc235f79a20 <_IO_cookie_write+48> call rax <getkeyserv_handle+528> |
触发条件:
- 伪造 vtable = IO_wfile_jumps+0x40
- 修改 top chunk -> P = 0,使 top chunk 不够分配
house of kiwi
1 | __malloc_assert -> fflush -> sync(_IO_file_jumps) |
1 | ► 0x7ffff7e78523 <fflush+131> call qword ptr [rbp + 0x60] <setcontext+61> |
触发条件:
- 修改 top chunk -> P = 0,使 top chunk 不够分配
IO_flush_all
1 | _IO_flush_all -> _IO_flush_all_lockp -> [_IO_wdefault_xsgetn](IO_wstrn_jumps) -> _IO_switch_to_wget_mode |
触发条件:
- 伪造 vtable = IO_wstrn_jumps+0x28
- 手动调用
_IO_flush_all
_IO_str_jumps -> _IO_str_overflow
1 | malloc_printerr -> __libc_message -> __GI_abort -> _IO_flush_all_lockp -> _IO_str_overflow |
- 在
libc-2.27.so
及之前,程序在_IO_str_overflow
里可以通过call qword ptr [rbx + 0xe0]
来执行指定的函数 - 在
libc-2.29.so
及之后,程序在__GI__IO_str_overflow
里不再使用上面的指令,而是调用call malloc@plt
,所以要在&_IO_list_all.vtable+8
处写入将要执行的函数
伪造条件:
1 | fp->_flags = 0 |
触发条件:
- 破坏 unsortedbin
- 执行 exit
_IO_str_jumps -> _IO_str_finish
1 | malloc_printerr -> __libc_message -> __GI_abort -> _IO_flush_all_lockp -> [_IO_str_finish] |
- 在
libc-2.27.so
及之前,程序在_IO_str_finish
里可以通过call qword ptr [rbx + 0xe8]
来执行指定的函数 - 在
libc-2.29.so
及之后,程序在_IO_str_finish
里不再使用上面的指令,而是调用call free@plt
,所以要在&_IO_list_all.vtable+0x10
处写入将要执行的函数
伪造条件:
1 | fp->_flags = 0 |
触发条件:
- 破坏 unsortedbin
- 执行 exit