house of apple2入门系列
字数 2223 2025-08-29 08:30:13
House of Apple2 利用技术详解
一、技术背景
随着高版本libc的普及,hook机制被移除,House of Apple2(简称HoA2)技术在高版本glibc(如2.35)下的利用变得越来越重要。该技术主要利用IO_FILE结构体的特性,通过伪造结构体和虚表来劫持程序执行流。
二、核心原理
1. 基本原理
HoA2利用largebin attack劫持_IO_list_all变量,将其替换为伪造的IO_FILE结构体。关键在于利用IO流函数中_wide_vtable调用时不检查vtable合法性的特点。
2. 关键调用链
- 程序从main返回或调用exit时,会遍历
_IO_list_all中的每个IO_FILE结构体 - 满足条件时会调用结构体中vtable->
_overflow函数指针 - glibc 2.24+增加了
IO_validate_vtable函数检查vtable合法性 _wide_data->_wide_vtable调用时不检查vtable合法性
3. 关键条件
-
_IO_flush_all_lockp条件:fp->_mode <= 0fp->_IO_write_ptr > fp->_IO_write_basefp->vtable = _IO_wfile_jumps
-
_IO_wfile_overflow条件:f->_flags & _IO_CURRENTLY_PUTTING) == 0f->wide_data->_IO_write_base == 0
-
_IO_wdoallocbuf最终目标:fp->wide_data->_wide_vtable->__doallocate = systemfp->_flags = "/bin/sh"的地址
三、利用条件
- 程序从main函数返回或能调用exit函数
- 能泄露出heap地址和libc地址
- 能使用一次largebin attack
四、利用步骤详解
1. 泄露libc基址
- 申请两个大小属于largebin的chunk(chunk0, chunk2)
- 申请一些用于防止合并的小chunk(chunk1, chunk3)
- 将chunk2 free掉,进入unsortedbin
- 申请一个比它大的chunk,使其进入largebin
- 利用UAF直接show泄露libc地址
2. 泄露heap地址
- 观察largebin中fd_nextsize存放的是chunk2的地址
- 覆盖fd和bk后,通过show泄露heap地址
3. largebin attack劫持io_list_all
- 将另一个largebin大小的堆块free进unsortedbin
- 编辑chunk2(此时fd和bk已被覆盖),将其改成largebin_chunk状态
- 将bk_nextsize改成
_IO_list_all - 0x20的位置 - 将chunk2放入largebin,此时io_list_all的fd_nextsize指向chunk0
- 成功将io_list_all劫持到chunk0
4. 布置伪造的IO_FILE结构体
在chunk0中需要布置:
- io_list_all的内容
- fp->io_wide_data
- fp->io_wide_data->wide_vtable
具体布置要求:
-
条件1:
fp->_mode = -1(<=0)fp->_IO_write_ptr = 2(>_IO_write_base=1)
-
条件2:
fp->vtable = _IO_wfile_jumps(偏移0xd8)
-
条件3:
_flags变量需满足f->_flags & _IO_CURRENTLY_PUTTING) == 0f->wide_data->_IO_write_base = 0- 将
fp->wide_data劫持到chunk0+0x100
-
条件4:
- 将
fp->wide_data->_wide_vtable劫持到chunk0+0x200 _wide_vtable在_wide_data中的偏移为0xe0- 将
__doallocate覆盖为system - 其余
_wide_vtable中的变量覆盖为0
- 将
5. 布置参数
使用预先申请的chunk8:
- 将
_flags改为"/bin/sh"的地址 - 同时满足
f->_flags & _IO_CURRENTLY_PUTTING) == 0的条件
五、EXP关键点
- 精心构造chunk0的布局,包含所有伪造的结构体
- 正确设置各个条件所需的字段值
- 确保所有指针和偏移计算准确
- 最后通过exit触发调用链
六、技术优势
- 适用于高版本glibc(2.24+)
- 绕过vtable合法性检查
- 只需要一次largebin attack即可完成利用
- 利用exit流程自然触发,不需要额外控制程序流
七、防御措施
- 及时更新glibc版本
- 检查largebin attack的可能性
- 对IO_FILE结构体进行完整性验证
- 限制堆操作的自由度
通过以上详细的步骤和原理分析,可以全面理解House of Apple2技术的利用方法和实现原理。在实际漏洞利用中,需要根据具体环境调整布局和偏移,但核心思路保持不变。