house of apple2 心得体会
字数 1655 2025-08-25 22:58:56
House of Apple2 利用技术详解
概述
House of Apple 是roderick师傅提出的一种新的glibc中IO攻击方法,即使在glibc 2.35版本中仍然是堆题的通杀手法。本文重点介绍利用_IO_wfile_overflow函数控制程序执行流的调用链。
适用版本
- glibc 2.23 至最新版本
利用条件
- 可以进行一次任意地址写(通常是largebin attack)
- 可以触发IO流操作(包括但不限于:从main函数返回、调用exit函数、通过
__malloc_assert触发)
核心原理
vtable劫持绕过
从glibc 2.24开始加入了对vtable指针的检查,IO_validate_vtable函数会检查vtable的合法性。我们可以通过以下方式绕过:
- 将vtable指向
_IO_wfile_jumps、_IO_wfile_jumps_mmap、_IO_wfile_jumps_maybe_mmap等合法jump类地址 - 利用
_IO_wide_data结构体中的_wide_vtable,该虚表没有合法性检查
关键调用链
_IO_wfile_overflow
--> _IO_wdoallocbuf
--> _IO_WDOALLOCATE
--> *(fp->_wide_data->_wide_vtable + 0x68)(fp)
结构体伪造要点
-
_IO_FILE_plus结构体:_flags需要满足:~(2 | 0x8 | 0x800)(若不需要控制rdi可直接设为0)_IO_write_base和_IO_buf_base设置为0_wide_data指向可控堆地址- vtable劫持为jump类(如
_IO_wfile_jumps)
-
_IO_wide_data结构体:_wide_vtable指向可控堆地址(伪造的_IO_jump_t)
-
_IO_jump_t结构体:_IO_wfile_doallocate位置布置为magic gadget- 后续布置ROP链或one_gadget
利用步骤详解
1. 获取地址信息
- 泄露libc基址和堆基址
- 计算关键符号地址:
_IO_list_all、_IO_wfile_jumps等
2. 伪造结构体
# _IO_FILE_plus伪造
pl = p64(0)+p64(leave_ret)+p64(0)+p64(io_all-0x20) # 2c0
pl += p64(0)*3 # 2e0
pl += p64(orw_addr) # _IO_save_base
pl += p64(0)*7
pl += p64(lock) # _lock
pl += p64(0)*2
pl += p64(chunk0 + 0xe0) # _IO_wide_data
pl += p64(0)*6
pl += p64(wfile) # vtable -> _IO_wfile_jumps
# _IO_wide_data伪造
pl += p64(0)*0x1c
pl += p64(chunk0 + 0xe0 + 0xe8) # _wide_vtable
# _IO_jump_t伪造
pl += p64(0)*0xd
pl += p64(magic_gadget) # _IO_wfile_doallocate
pl += orw # ROP链
3. Largebin Attack
- 劫持
_IO_list_all指向可控堆地址 - 通过伪造size和bk_nextsize实现任意地址写
4. 触发IO操作
通过以下方式之一触发:
- 从main函数返回
- 调用exit函数
- 触发
__malloc_assert
例题分析
例题1: pwn_one
利用流程:
- 泄露libc和heap地址
- 伪造IO结构体
- largebin attack劫持
_IO_list_all - exit退出触发IO调用
关键检查:
f->_flags & _IO_NO_WRITES == 0f->_flags & _IO_CURRENTLY_PUTTING == 0f->_wide_data->_IO_write_base == 0fp->_wide_data->_IO_buf_base != 0fp->_flags & _IO_UNBUFFERED == 0
例题2: house of cat
特殊处理:
- 需要构造close(0)关闭标准输入
- 通过栈迁移执行ROP链
- 修改top_chunk大小触发
__malloc_assert
参考技术点
- Magic Gadget:
<svcudp_reply+26>: mov rbp,QWORD PTR [rdi+0x48]
<svcudp_reply+30>: mov rax,QWORD PTR [rbp+0x18]
<svcudp_reply+34>: lea r13,[rbp+0x10]
<svcudp_reply+38>: mov DWORD PTR [rbp+0x10],0x0
<svcudp_reply+45>: mov rdi,r13
<svcudp_reply+48>: call QWORD PTR [rax+0x28]
- 关键符号偏移:
_IO_list_all_IO_wfile_jumpsstderr_IO_stdfile_2_lock
防御与检测
- 检测largebin attack的异常操作
- 监控
_IO_list_all等关键IO结构体的修改 - 加强vtable的完整性检查
总结
House of Apple2是一种强大的IO利用技术,通过精心构造IO结构体和利用largebin attack,可以在现代glibc版本中实现稳定的利用。关键在于理解IO流操作的内部机制和各结构体之间的关系,以及如何绕过现有的防护机制。