house of apple2
本文最后更新于:2025年2月4日 下午
前情提要
glibc高版本中逐渐移除了__malloc_hook/__free_hook/__realloc_hook等hook全局变量(实现还在,但2.34中被直接赋为NULL,且无实际应用),伪造IO_FILE结构体并利用IO流攻击便成为高版本题目主流。
house of apple的使用条件为:
程序能从main函数返回或能调用exit函数、能得到heap_base和libc_base、能使用一次largebin attack。
当程序从main函数返回或执行exit函数的时候,均会调用fcloseall函数,最后会遍历_IO_list_all存放的每一个IO_FILE结构体,如果满足条件的话,会调用每个结构体中vtable->_overflow函数指针指向的函数。使用largebin attack可以劫持_IO_list_all变量,将其替换为伪造的IO_FILE结构体,并同时修改_wide_data成员的值,并且可以利用_IO_wstrn_overflow将已知地址空间上的某些值修改为一个已知值。
amd64下,_wide_data在IO_FILE中的偏移为0xa0。
house of apple1 是通过控制 fp->_wide_data 来实现的一个任意地址写已知地址的作用,相当于一次 largebin attack 主要是用来结合 FSOP 及 setcontext+61 等调用链来实现getshell,暂按下不表
house of apple2 和 House of apple3 都是通过 FILE 结构体的伪造来进行攻击,这里主要介绍house of apple2的调用方法:
1 | |
house of apple2 延续了之前利用largebin attack 劫持IO_FILE结构体的思想,在house of apple2中,我们要利用的是 _IO_FILE的一个成员 _wide_data。
程序从 main 返回或者执行 exit 后会遍历_IO_list_all存放的每一个IO_FILE结构体,如果满足条件的话,会调用每个结构体中vtable->_overflow函数指针指向的函数。
glibc2.23及之前没有vtable的检测,可以任意劫持执行的函数。之后增加了对vtable合法性的检测的IO_validate_vtable函数。
1 | |
不同版本有一点代码编写上的区别,但是最终效果是完全一致的。
1 | |
1 | |
利用思路即:
- 劫持
IO_FILE的vtable为_IO_wfile_jumps - 控制
_wide_data为可控的堆地址空间 - 控制
_wide_data->_wide_vtable为可控的堆地址空间 - 控制程序执行
IO流函数调用,最终调用到_IO_Wxxxxx函数即可控制程序的执行流
目前已知三条可行的能执行到_IO_Wxxxxx函数的利用:
_IO_wfile_overflow_IO_wfile_underflow_mmap_IO_wdefault_xsgetn
调用链分析
1. _IO_wfile_overflow
1 | |
1 | |
调用链为:
1 | |
2. _IO_wfile_underflow_mmap
1 | |
调用链为:
1 | |
3. _IO_wdefault_xsgetn
1 | |
1 | |
1 | |
调用链为:
1 | |