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 至最新版本

利用条件

  1. 可以进行一次任意地址写(通常是largebin attack)
  2. 可以触发IO流操作(包括但不限于:从main函数返回、调用exit函数、通过__malloc_assert触发)

核心原理

vtable劫持绕过

从glibc 2.24开始加入了对vtable指针的检查,IO_validate_vtable函数会检查vtable的合法性。我们可以通过以下方式绕过:

  1. 将vtable指向_IO_wfile_jumps_IO_wfile_jumps_mmap_IO_wfile_jumps_maybe_mmap等合法jump类地址
  2. 利用_IO_wide_data结构体中的_wide_vtable,该虚表没有合法性检查

关键调用链

_IO_wfile_overflow 
--> _IO_wdoallocbuf 
--> _IO_WDOALLOCATE 
--> *(fp->_wide_data->_wide_vtable + 0x68)(fp)

结构体伪造要点

  1. _IO_FILE_plus结构体

    • _flags需要满足:~(2 | 0x8 | 0x800)(若不需要控制rdi可直接设为0)
    • _IO_write_base_IO_buf_base设置为0
    • _wide_data指向可控堆地址
    • vtable劫持为jump类(如_IO_wfile_jumps
  2. _IO_wide_data结构体

    • _wide_vtable指向可控堆地址(伪造的_IO_jump_t
  3. _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

利用流程

  1. 泄露libc和heap地址
  2. 伪造IO结构体
  3. largebin attack劫持_IO_list_all
  4. exit退出触发IO调用

关键检查

  • f->_flags & _IO_NO_WRITES == 0
  • f->_flags & _IO_CURRENTLY_PUTTING == 0
  • f->_wide_data->_IO_write_base == 0
  • fp->_wide_data->_IO_buf_base != 0
  • fp->_flags & _IO_UNBUFFERED == 0

例题2: house of cat

特殊处理

  • 需要构造close(0)关闭标准输入
  • 通过栈迁移执行ROP链
  • 修改top_chunk大小触发__malloc_assert

参考技术点

  1. 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]
  1. 关键符号偏移
  • _IO_list_all
  • _IO_wfile_jumps
  • stderr
  • _IO_stdfile_2_lock

防御与检测

  1. 检测largebin attack的异常操作
  2. 监控_IO_list_all等关键IO结构体的修改
  3. 加强vtable的完整性检查

总结

House of Apple2是一种强大的IO利用技术,通过精心构造IO结构体和利用largebin attack,可以在现代glibc版本中实现稳定的利用。关键在于理解IO流操作的内部机制和各结构体之间的关系,以及如何绕过现有的防护机制。

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_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. 伪造结构体 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 == 0 f->_flags & _IO_CURRENTLY_PUTTING == 0 f->_wide_data->_IO_write_base == 0 fp->_wide_data->_IO_buf_base != 0 fp->_flags & _IO_UNBUFFERED == 0 例题2: house of cat 特殊处理 : 需要构造close(0)关闭标准输入 通过栈迁移执行ROP链 修改top_ chunk大小触发 __malloc_assert 参考技术点 Magic Gadget : 关键符号偏移 : _IO_list_all _IO_wfile_jumps stderr _IO_stdfile_2_lock 防御与检测 检测largebin attack的异常操作 监控 _IO_list_all 等关键IO结构体的修改 加强vtable的完整性检查 总结 House of Apple2是一种强大的IO利用技术,通过精心构造IO结构体和利用largebin attack,可以在现代glibc版本中实现稳定的利用。关键在于理解IO流操作的内部机制和各结构体之间的关系,以及如何绕过现有的防护机制。