深入分析IO_FILE、Unsortbin attack与Largebin attack的结合利用
字数 1841 2025-08-05 08:18:36
深入分析IO_FILE与堆攻击技术的结合利用
前言
本文详细分析IO_FILE结构与Unsortbin attack、Largebin attack等堆利用技术的结合利用方法,通过*CTF heap_master题目为例,展示多种利用技巧。
基础概念
IO_FILE结构
IO_FILE是glibc中用于文件I/O操作的核心数据结构,包含文件描述符、缓冲区指针和各种标志位。通过伪造IO_FILE结构可以实现内存泄漏和程序流劫持。
堆利用技术
- Unsortbin attack: 通过修改unsorted bin的bk指针实现任意地址写一个libc地址
- Largebin attack: 通过large bin的链表操作实现任意地址写堆地址
- Fastbin attack: 通过fastbin的链表操作实现有限制的任意地址分配
利用技术详解
技术1: Unsortbin attack + _IO_list_all劫持
利用步骤
-
泄漏准备:
- 构造伪造的_IO_2_1_stdout结构
- 通过Unsortbin attack修改global_max_fast
- 利用fastbin特性实现任意地址写堆地址
-
地址泄漏:
- 覆盖stdout指针指向伪造结构
- 精心构造_flag和缓冲区指针实现泄漏
- 获取libc基址和堆地址
-
程序流劫持:
- 构造伪造的IO_FILE结构触发_IO_flush_all_lockp
- 利用_IO_str_jumps的overflow函数指针
- 通过setcontext实现栈转移和ROP
关键点
- _IO_FILE结构需要满足特定条件才能触发泄漏
- 需要绕过_IO_str_overflow的多个检查条件
- setcontext的利用需要精确控制rdi指向的内存布局
技术2: Unsortbin attack + _dl_open_hook劫持
利用步骤
- 通过Unsortbin attack修改_dl_open_hook
- 劫持到特定gadget控制rdi
- 再次利用setcontext实现栈转移
优势
- 不需要构造完整的IO_FILE结构
- 利用链相对简单直接
技术3: Largebin attack + _dl_open_hook劫持
利用步骤
- 通过Largebin attack修改stdout的_flag为堆地址
- 精心构造_flag实现泄漏
- 再次使用Largebin attack修改_dl_open_hook
- 完成程序流劫持
特点
- 使用Largebin attack替代Unsortbin attack
- 泄漏方式有所不同但效果相同
技术4: Largebin attack + __free_hook劫持
利用步骤
- 通过Largebin attack泄漏地址
- 再次使用Largebin attack修改global_max_fast
- 利用fastbin attack修改__free_hook
- 触发free执行system("/bin/sh")
优势
- 利用链更短更直接
- 不需要复杂的栈转移
利用延伸与变种
-
多种劫持目标选择:
- _IO_list_all
- _dl_open_hook
- __free_hook/__malloc_hook
- 其他hook或函数指针
-
泄漏方式变种:
- 通过修改stdout_flag泄漏
- 通过修改write_base最低字节错位泄漏
- 其他IO结构的泄漏方式
-
程序流劫持变种:
- 直接劫持到one_gadget
- 通过ROP构造更复杂的利用
- 结合其他漏洞实现更稳定的利用
防御与绕过
-
常见防御措施:
- IO_FILE结构完整性检查
- 堆指针有效性验证
- 敏感函数指针保护
-
可能的绕过方法:
- 精心构造满足检查条件的伪造结构
- 利用部分写绕过指针验证
- 结合其他漏洞突破防御
参考实现
完整利用代码请参考原文提供的四个EXP实现,分别对应不同的利用技术组合。每个EXP都包含了从初始化、泄漏到最终劫持的完整过程。
总结
IO_FILE与堆利用技术的结合提供了多种灵活的攻击路径,关键在于:
- 理解每种攻击技术的原理和限制
- 掌握IO_FILE结构的伪造方法
- 能够根据目标环境选择合适的利用链
- 具备调试和绕过各种检查的能力
通过混合使用不同的堆利用技术和IO_FILE特性,可以在各种限制条件下实现稳定的利用。