[ctf-PWN] house of orange 详细解析
字数 1678 2025-08-18 17:33:40

House of Orange 漏洞利用技术详解

一、概述

House of Orange 是一种针对 glibc 堆管理机制的漏洞利用技术,最早出现在 2016 年的 Hitcon CTF 比赛中。该技术可以在没有 free() 函数的情况下实现堆利用,通过精心构造的堆操作触发系统调用 _int_free,最终实现任意代码执行。

二、前置知识

1. 关键堆管理机制

  • Top Chunk: 堆内存中未被分配的顶部区域,当现有堆空间不足时会从这里分割
  • Unsorted Bin: 释放的小块内存首先进入的 bin,用于快速重新分配
  • File Stream Oriented Programming (FSOP): 通过控制 FILE 结构体实现代码执行的技术

2. 相关数据结构

struct _IO_FILE {
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* ... */
};

三、利用步骤详解

1. Top Chunk 利用部分

  1. 分配堆块:首先分配足够大的堆块,使得后续分配需要扩展堆
  2. 修改 Top Chunk Size:通过堆溢出或其他漏洞修改 Top Chunk 的 size 字段
    • 需要满足:size > MINSIZEsize < av->system_memsize 需要页对齐
  3. 触发 _int_free:当再次分配内存时,系统会检查 Top Chunk 是否足够,不足时会调用 sysmalloc
    • 如果 Top Chunk 的 size 被修改为非法值,sysmalloc 会调用 _int_free 释放这个 Top Chunk

2. Unsorted Bin Attack 部分

  1. Top Chunk 进入 Unsorted Bin:通过上述操作,Top Chunk 被释放到 Unsorted Bin
  2. 修改 FD/BK 指针:利用堆漏洞修改 Unsorted Bin 中 chunk 的 bk 指针
  3. 触发分配:下次分配时,glibc 会从 Unsorted Bin 中取出 chunk 并错误地写入主 arena 地址
    • 这可以用来修改 _IO_list_all 等关键全局变量

3. FSOP 部分

  1. 伪造 FILE 结构体:在可控内存区域构造伪造的 FILE 结构
    • 设置 _flags_IO_MAGIC (0xFBAD0000)
    • 设置 vtable 指针指向可控区域
  2. 触发异常处理:通过构造的 FILE 操作链触发异常处理流程
    • 通常利用 _IO_OVERFLOW 函数指针
  3. 获取控制流:当程序调用如 exit()abort() 时会遍历 FILE 链表,执行伪造的函数指针

四、关键点分析

  1. Top Chunk 大小修改约束

    • 必须页对齐(通常 0x1000 对齐)
    • 必须大于 MINSIZE (0x10 on 32-bit, 0x20 on 64-bit)
    • 必须小于 av->system_mem(通常 0x21000)
  2. Unsorted Bin Attack 目标

    • 修改 _IO_list_all 指向伪造的 FILE 结构
    • 修改 global_max_fast 可以启用 fastbin attack
  3. FSOP 构造技巧

    • 需要绕过 _IO_flush_all_lockp 中的检查
    • vtable 需要指向合法内存区域(可通过 smallbin attack 控制)

五、防御措施

  1. glibc 防护机制

    • _IO_vtable_check:验证 vtable 的合法性
    • 更严格的 size 检查
  2. 缓解措施

    • 更新到最新版 glibc
    • 启用 ASLR 和堆保护机制
    • 使用 hardened malloc 实现

六、实际利用示例

from pwn import *

# 1. 分配堆块耗尽现有空间
alloc(0x400)  # 假设存在分配函数

# 2. 溢出修改top chunk size
overflow(payload=b'A'*offset + p64(fake_size))

# 3. 触发sysmalloc
alloc(0x1000)  # 需要大于修改后的top size

# 此时top chunk被释放到unsorted bin
# 后续可进行unsorted bin attack和FSOP构造

七、总结

House of Orange 技术展示了如何通过精心构造的堆操作在没有显式 free 的情况下实现内存释放和利用。该技术结合了多种堆利用技巧,是理解现代堆漏洞利用的重要案例。防御方面,除了保持系统更新外,还需要注意对用户输入进行严格校验,防止堆溢出等漏洞的发生。

House of Orange 漏洞利用技术详解 一、概述 House of Orange 是一种针对 glibc 堆管理机制的漏洞利用技术,最早出现在 2016 年的 Hitcon CTF 比赛中。该技术可以在没有 free() 函数的情况下实现堆利用,通过精心构造的堆操作触发系统调用 _int_free ,最终实现任意代码执行。 二、前置知识 1. 关键堆管理机制 Top Chunk : 堆内存中未被分配的顶部区域,当现有堆空间不足时会从这里分割 Unsorted Bin : 释放的小块内存首先进入的 bin,用于快速重新分配 File Stream Oriented Programming (FSOP) : 通过控制 FILE 结构体实现代码执行的技术 2. 相关数据结构 三、利用步骤详解 1. Top Chunk 利用部分 分配堆块 :首先分配足够大的堆块,使得后续分配需要扩展堆 修改 Top Chunk Size :通过堆溢出或其他漏洞修改 Top Chunk 的 size 字段 需要满足: size > MINSIZE 、 size < av->system_mem 、 size 需要页对齐 触发 _int_free :当再次分配内存时,系统会检查 Top Chunk 是否足够,不足时会调用 sysmalloc 如果 Top Chunk 的 size 被修改为非法值, sysmalloc 会调用 _int_free 释放这个 Top Chunk 2. Unsorted Bin Attack 部分 Top Chunk 进入 Unsorted Bin :通过上述操作,Top Chunk 被释放到 Unsorted Bin 修改 FD/BK 指针 :利用堆漏洞修改 Unsorted Bin 中 chunk 的 bk 指针 触发分配 :下次分配时,glibc 会从 Unsorted Bin 中取出 chunk 并错误地写入主 arena 地址 这可以用来修改 _IO_list_all 等关键全局变量 3. FSOP 部分 伪造 FILE 结构体 :在可控内存区域构造伪造的 FILE 结构 设置 _flags 为 _IO_MAGIC (0xFBAD0000) 设置 vtable 指针指向可控区域 触发异常处理 :通过构造的 FILE 操作链触发异常处理流程 通常利用 _IO_OVERFLOW 函数指针 获取控制流 :当程序调用如 exit() 或 abort() 时会遍历 FILE 链表,执行伪造的函数指针 四、关键点分析 Top Chunk 大小修改约束 : 必须页对齐(通常 0x1000 对齐) 必须大于 MINSIZE (0x10 on 32-bit, 0x20 on 64-bit) 必须小于 av->system_mem (通常 0x21000) Unsorted Bin Attack 目标 : 修改 _IO_list_all 指向伪造的 FILE 结构 修改 global_max_fast 可以启用 fastbin attack FSOP 构造技巧 : 需要绕过 _IO_flush_all_lockp 中的检查 vtable 需要指向合法内存区域(可通过 smallbin attack 控制) 五、防御措施 glibc 防护机制 : _IO_vtable_check :验证 vtable 的合法性 更严格的 size 检查 缓解措施 : 更新到最新版 glibc 启用 ASLR 和堆保护机制 使用 hardened malloc 实现 六、实际利用示例 七、总结 House of Orange 技术展示了如何通过精心构造的堆操作在没有显式 free 的情况下实现内存释放和利用。该技术结合了多种堆利用技巧,是理解现代堆漏洞利用的重要案例。防御方面,除了保持系统更新外,还需要注意对用户输入进行严格校验,防止堆溢出等漏洞的发生。