[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 利用部分
- 分配堆块:首先分配足够大的堆块,使得后续分配需要扩展堆
- 修改 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
- 如果 Top Chunk 的 size 被修改为非法值,
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 实现
六、实际利用示例
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 的情况下实现内存释放和利用。该技术结合了多种堆利用技巧,是理解现代堆漏洞利用的重要案例。防御方面,除了保持系统更新外,还需要注意对用户输入进行严格校验,防止堆溢出等漏洞的发生。