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. 关键调用链

  1. 程序从main返回或调用exit时,会遍历_IO_list_all中的每个IO_FILE结构体
  2. 满足条件时会调用结构体中vtable->_overflow函数指针
  3. glibc 2.24+增加了IO_validate_vtable函数检查vtable合法性
  4. _wide_data->_wide_vtable调用时不检查vtable合法性

3. 关键条件

  1. _IO_flush_all_lockp条件:

    • fp->_mode <= 0
    • fp->_IO_write_ptr > fp->_IO_write_base
    • fp->vtable = _IO_wfile_jumps
  2. _IO_wfile_overflow条件:

    • f->_flags & _IO_CURRENTLY_PUTTING) == 0
    • f->wide_data->_IO_write_base == 0
  3. _IO_wdoallocbuf最终目标:

    • fp->wide_data->_wide_vtable->__doallocate = system
    • fp->_flags = "/bin/sh"的地址

三、利用条件

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

四、利用步骤详解

1. 泄露libc基址

  1. 申请两个大小属于largebin的chunk(chunk0, chunk2)
  2. 申请一些用于防止合并的小chunk(chunk1, chunk3)
  3. 将chunk2 free掉,进入unsortedbin
  4. 申请一个比它大的chunk,使其进入largebin
  5. 利用UAF直接show泄露libc地址

2. 泄露heap地址

  1. 观察largebin中fd_nextsize存放的是chunk2的地址
  2. 覆盖fd和bk后,通过show泄露heap地址

3. largebin attack劫持io_list_all

  1. 将另一个largebin大小的堆块free进unsortedbin
  2. 编辑chunk2(此时fd和bk已被覆盖),将其改成largebin_chunk状态
  3. 将bk_nextsize改成_IO_list_all - 0x20的位置
  4. 将chunk2放入largebin,此时io_list_all的fd_nextsize指向chunk0
  5. 成功将io_list_all劫持到chunk0

4. 布置伪造的IO_FILE结构体

在chunk0中需要布置:

  1. io_list_all的内容
  2. fp->io_wide_data
  3. fp->io_wide_data->wide_vtable

具体布置要求

  1. 条件1:

    • fp->_mode = -1(<=0)
    • fp->_IO_write_ptr = 2(> _IO_write_base=1
  2. 条件2:

    • fp->vtable = _IO_wfile_jumps(偏移0xd8)
  3. 条件3:

    • _flags变量需满足f->_flags & _IO_CURRENTLY_PUTTING) == 0
    • f->wide_data->_IO_write_base = 0
    • fp->wide_data劫持到chunk0+0x100
  4. 条件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关键点

  1. 精心构造chunk0的布局,包含所有伪造的结构体
  2. 正确设置各个条件所需的字段值
  3. 确保所有指针和偏移计算准确
  4. 最后通过exit触发调用链

六、技术优势

  1. 适用于高版本glibc(2.24+)
  2. 绕过vtable合法性检查
  3. 只需要一次largebin attack即可完成利用
  4. 利用exit流程自然触发,不需要额外控制程序流

七、防御措施

  1. 及时更新glibc版本
  2. 检查largebin attack的可能性
  3. 对IO_FILE结构体进行完整性验证
  4. 限制堆操作的自由度

通过以上详细的步骤和原理分析,可以全面理解House of Apple2技术的利用方法和实现原理。在实际漏洞利用中,需要根据具体环境调整布局和偏移,但核心思路保持不变。

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 <= 0 fp->_IO_write_ptr > fp->_IO_write_base fp->vtable = _IO_wfile_jumps _IO_wfile_overflow 条件 : f->_flags & _IO_CURRENTLY_PUTTING) == 0 f->wide_data->_IO_write_base == 0 _IO_wdoallocbuf 最终目标 : fp->wide_data->_wide_vtable->__doallocate = system fp->_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) == 0 f->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技术的利用方法和实现原理。在实际漏洞利用中,需要根据具体环境调整布局和偏移,但核心思路保持不变。