新型 IO 利用方法学习——House of apple2
字数 1820 2025-08-20 18:18:16
House of apple2 IO利用方法详解
1. 简介
House of apple是roderick01在2022年7月提出的一种新型IO利用思路,分为三种调用方式:House of apple1、House of apple2和House of apple3。这些调用方式基于新发现的调用链:IO_FILE -> _wide_data。
2. 前置知识
2.1 高版本libc的变化
在libc2.34及以上版本中,glibc移除了许多hook全局变量,包括:
_malloc_hook_free_hook_realloc_hook
这使得传统的hook函数利用方式失效,高版本堆利用必须依赖于:
- 伪造
_IO_FILE结构体 - 劫持IO流
2.2 相关IO利用技术
- House of pig:需要结合tcache stashing unlink attack和largebin attack
- House of kiwi & House of emma:需要绕过或劫持TLS结构体
- House of cat:需要多次largebin attack或任意写操作
3. House of apple2的优势
House of apple2是目前用途最广、攻击效果最好的高版本堆利用方式之一,主要优势在于:
- 只需要一次largebin attack
- 利用条件相对宽松
- 全版本通用
4. 利用条件
- 程序从main函数返回或能调用exit函数
- 能泄露heap地址和libc地址
- 能使用一次largebin attack
5. 核心利用思路
House of apple2利用_IO_FILE结构体中的_wide_data成员,该成员的特殊性在于:
- 包含
_wide_vtable虚表 - 调用
_wide_vtable中的函数时没有vtable合法性检查
具体利用步骤:
- 劫持
IO_FILE的vtable为_IO_wfile_jumps - 控制
_wide_data为可控的堆地址空间 - 控制
_wide_data->_wide_vtable为可控的堆地址空间 - 控制程序执行IO流函数调用,最终调用到
_IO_Wxxxxx函数控制执行流
6. 关键调用链分析
6.1 _IO_wfile_overflow调用链
_IO_wfile_overflow
→ _IO_wdoallocbuf
→ _IO_WDOALLOCATE
6.2 _IO_wfile_underflow_mmap调用链
_IO_wfile_underflow_mmap
→ _IO_wdoallocbuf
→ _IO_WDOALLOCATE
6.3 _IO_wdefault_xsgetn调用链
_IO_wdefault_xsgetn
→ __wunderflow
→ _IO_switch_to_wget_mode
→ _IO_WOVERFLOW
7. 例题分析:heaporw
7.1 程序分析
程序提供基本功能:
- 添加largebin chunk (0x420-0x550)
- 删除chunk(存在UAF)
- 显示chunk内容
- 编辑chunk内容
7.2 利用步骤
-
泄露libc地址:
- 分配两个largebin chunk
- 释放其中一个并显示,泄露libc地址
-
泄露heap地址:
- 通过编辑释放的chunk修改size,使其进入tcache
- 显示tcache chunk获取heap地址
-
构造largebin attack:
- 准备两个largebin chunk和两个smallbin chunk
- 通过修改bk_nextsize实现largebin attack
-
构造fake IO结构:
- 伪造
_IO_FILE结构体 - 设置
_wide_data指向可控区域 - 设置
_wide_vtable指向伪造的虚表
- 伪造
-
构造ROP链:
- 使用
svcudp_reply+26的gadget实现栈迁移 - 构造ORW链读取flag
- 使用
7.3 关键代码片段
# 伪造IO结构
pl = p64(0)+p64(leave_ret)+p64(0)+p64(io_all-0x20)
pl += p64(0)*2+p64(0)+p64(orw_addr) # chunk0+0x48
pl += p64(0)*4
pl += p64(0)*3+p64(lock)
pl += p64(0)*2+p64(chunk0+0xe0)+p64(0)
pl += p64(0)*4
pl += p64(0)+p64(wfile)
pl += p64(0)*0x1c+p64(chunk0+0xe0+0xe8) # chunk0+0xe0
pl += p64(0)*0xd+p64(magic_gadget)
# ORW链
orw = b'./flag\x00\x00'
orw += p64(pop_rdx_r12)+p64(0)+p64(chunk0-0x10)
orw += p64(pop_rdi)+p64(orw_addr)
orw += p64(pop_rsi)+p64(0)
orw += p64(open_addr)
orw += p64(pop_rdi)+p64(3)
orw += p64(pop_rsi)+p64(orw_addr+0x100)
orw += p64(pop_rdx_r12)+p64(0x50)+p64(0)
orw += p64(read_addr)
orw += p64(pop_rdi)+p64(orw_addr+0x100)
orw += p64(puts_addr)
8. 执行流程
- 程序退出时遍历
_IO_list_all - 调用伪造的
_IO_FILE结构体中的_IO_wfile_overflow - 通过
_IO_wdoallocbuf调用_IO_WDOALLOCATE _IO_WDOALLOCATE被伪造成svcudp_reply+26的gadget- 执行ROP链实现ORW
9. 总结
House of apple2通过利用_wide_data绕过了vtable检查,只需要一次largebin attack即可实现代码执行,是目前高版本IO利用中最有效的方法之一。关键在于:
- 正确伪造
_IO_FILE结构体 - 合理设置
_wide_data和_wide_vtable - 选择合适的调用链触发执行流劫持