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 |
|