新型 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函数利用方式失效,高版本堆利用必须依赖于:

  1. 伪造_IO_FILE结构体
  2. 劫持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. 利用条件

  1. 程序从main函数返回或能调用exit函数
  2. 能泄露heap地址和libc地址
  3. 能使用一次largebin attack

5. 核心利用思路

House of apple2利用_IO_FILE结构体中的_wide_data成员,该成员的特殊性在于:

  • 包含_wide_vtable虚表
  • 调用_wide_vtable中的函数时没有vtable合法性检查

具体利用步骤:

  1. 劫持IO_FILE的vtable为_IO_wfile_jumps
  2. 控制_wide_data为可控的堆地址空间
  3. 控制_wide_data->_wide_vtable为可控的堆地址空间
  4. 控制程序执行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 利用步骤

  1. 泄露libc地址

    • 分配两个largebin chunk
    • 释放其中一个并显示,泄露libc地址
  2. 泄露heap地址

    • 通过编辑释放的chunk修改size,使其进入tcache
    • 显示tcache chunk获取heap地址
  3. 构造largebin attack

    • 准备两个largebin chunk和两个smallbin chunk
    • 通过修改bk_nextsize实现largebin attack
  4. 构造fake IO结构

    • 伪造_IO_FILE结构体
    • 设置_wide_data指向可控区域
    • 设置_wide_vtable指向伪造的虚表
  5. 构造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. 执行流程

  1. 程序退出时遍历_IO_list_all
  2. 调用伪造的_IO_FILE结构体中的_IO_wfile_overflow
  3. 通过_IO_wdoallocbuf调用_IO_WDOALLOCATE
  4. _IO_WDOALLOCATE被伪造成svcudp_reply+26的gadget
  5. 执行ROP链实现ORW

9. 总结

House of apple2通过利用_wide_data绕过了vtable检查,只需要一次largebin attack即可实现代码执行,是目前高版本IO利用中最有效的方法之一。关键在于:

  1. 正确伪造_IO_FILE结构体
  2. 合理设置_wide_data_wide_vtable
  3. 选择合适的调用链触发执行流劫持
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 调用链 6.2 _IO_wfile_underflow_mmap 调用链 6.3 _IO_wdefault_xsgetn 调用链 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 关键代码片段 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 选择合适的调用链触发执行流劫持