深入分析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劫持

利用步骤

  1. 泄漏准备:

    • 构造伪造的_IO_2_1_stdout结构
    • 通过Unsortbin attack修改global_max_fast
    • 利用fastbin特性实现任意地址写堆地址
  2. 地址泄漏:

    • 覆盖stdout指针指向伪造结构
    • 精心构造_flag和缓冲区指针实现泄漏
    • 获取libc基址和堆地址
  3. 程序流劫持:

    • 构造伪造的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劫持

利用步骤

  1. 通过Unsortbin attack修改_dl_open_hook
  2. 劫持到特定gadget控制rdi
  3. 再次利用setcontext实现栈转移

优势

  • 不需要构造完整的IO_FILE结构
  • 利用链相对简单直接

技术3: Largebin attack + _dl_open_hook劫持

利用步骤

  1. 通过Largebin attack修改stdout的_flag为堆地址
  2. 精心构造_flag实现泄漏
  3. 再次使用Largebin attack修改_dl_open_hook
  4. 完成程序流劫持

特点

  • 使用Largebin attack替代Unsortbin attack
  • 泄漏方式有所不同但效果相同

技术4: Largebin attack + __free_hook劫持

利用步骤

  1. 通过Largebin attack泄漏地址
  2. 再次使用Largebin attack修改global_max_fast
  3. 利用fastbin attack修改__free_hook
  4. 触发free执行system("/bin/sh")

优势

  • 利用链更短更直接
  • 不需要复杂的栈转移

利用延伸与变种

  1. 多种劫持目标选择:

    • _IO_list_all
    • _dl_open_hook
    • __free_hook/__malloc_hook
    • 其他hook或函数指针
  2. 泄漏方式变种:

    • 通过修改stdout_flag泄漏
    • 通过修改write_base最低字节错位泄漏
    • 其他IO结构的泄漏方式
  3. 程序流劫持变种:

    • 直接劫持到one_gadget
    • 通过ROP构造更复杂的利用
    • 结合其他漏洞实现更稳定的利用

防御与绕过

  1. 常见防御措施:

    • IO_FILE结构完整性检查
    • 堆指针有效性验证
    • 敏感函数指针保护
  2. 可能的绕过方法:

    • 精心构造满足检查条件的伪造结构
    • 利用部分写绕过指针验证
    • 结合其他漏洞突破防御

参考实现

完整利用代码请参考原文提供的四个EXP实现,分别对应不同的利用技术组合。每个EXP都包含了从初始化、泄漏到最终劫持的完整过程。

总结

IO_FILE与堆利用技术的结合提供了多种灵活的攻击路径,关键在于:

  1. 理解每种攻击技术的原理和限制
  2. 掌握IO_FILE结构的伪造方法
  3. 能够根据目标环境选择合适的利用链
  4. 具备调试和绕过各种检查的能力

通过混合使用不同的堆利用技术和IO_FILE特性,可以在各种限制条件下实现稳定的利用。

深入分析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特性,可以在各种限制条件下实现稳定的利用。