house of cat
只要可以largebin(任意地址写入可控地址)就可以实现,要求很低
同house of emma,前面的利用链仍然是__fxprintf --> locked_vfxprinf --> __vfprintf_internal --> _IO_default_xsputn
,然后利用去调用_IO_default_xsputn
时修改vtable在合理范围的偏移去执行我们想要的内容,house of cat利用的是_IO_wfile_seekoff
,当然也可以通过FSOP来完成这一步
_IO_wfile_seekoff ----> _IO_switch_to_wget_mode:
rdi = stderr ---> rax1 = stderr + 0xa0 ----> rax2 = rax1 + 0xe0 ----> call rax2 + 0x18
因为rdi是可控的,所以程序流可控且rdx可控,就可以去执行setcontext+orw了
强网杯2022|house of cat
IDA
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
需要绕过的判断:
1 | __int64 __fastcall sub_1A50(char *a1, __int64 a2) |
逆了挺久也没搞清楚,是我太菜了 orz
后面就是看了网上师傅的逆向结果
add:用的calloc 限制了size大小 0x418~0x46F
1 | ssize_t add() |
delete:存在uaf
show:正常
edit:固定写入0x30,限制了2次次数(开始自己做的时候就没注意这里qwq)
1 | ssize_t sub_1916() |
思路及过程
因为和house of emma挺相似的,思路还是差不多的,不过house of cat不用去修改 __pointer_chk_guard
1、先泄露地址
2、然后利用 largebin attack去修改stderr
3、然后利用 largebin attack去修改top_chunk
4、触发assert
伪造的vtable
偏移跳转到_IO_wfile_seekoff
之后会跳转到_IO_switch_to_wget_mode,到这里就是我们要利用的地方了
rdi = stderr ---> rax1 = stderr + 0xa0 ----> rax2 = rax1 + 0xe0 ----> call rax2 + 0x18
同时rdx = rax1 + 0x20
所以可以伪造IO:
然后就会进入setcontext+61去执行rdx+0xe0–>orw
- 本文作者: 1uckyc
- 本文链接: https://1uckyc.github.io/2023/09/24/house-of-cat学习以及复现/