手把手带你搞懂堆利用套路
字数 1599 2025-08-29 22:41:24
堆利用套路详解
前言
堆利用是二进制安全领域中的重要技术,掌握各种堆利用技巧对于漏洞分析和利用至关重要。本文将系统性地介绍多种堆利用技术,包括UAF、first_fit、fastbin_dup、unsafe_unlink和tcache等利用方法。
UAF (Use After Free)
UAF是指释放后的内存被继续使用的情况,这是最常见的堆漏洞类型之一。
利用要点:
- 在对象被释放后,指针未被清空
- 程序继续使用这个悬垂指针
- 通过重新分配相同大小的内存块来控制原指针指向的内容
利用步骤:
- 分配一个对象A
- 释放对象A但不清空指针
- 分配对象B,大小与A相同,占据A原来的内存空间
- 通过原指针操作A,实际上是操作B的内存
first_fit
first_fit是glibc堆分配器的基本策略,指分配器会从空闲列表中找到第一个足够大的块进行分配。
利用要点:
- 了解glibc的分配策略
- 控制堆布局,使目标块成为第一个满足条件的空闲块
- 常用于结合其他漏洞实现更复杂的利用
fastbin_dup
fastbin_dup是利用fastbin的单链表特性实现的双重释放漏洞。
fastbin_dup_into_stack
利用步骤:
- 分配三个相同大小的chunk(A, B, C)
- 释放A、B、A(形成A->B->A的fastbin链表)
- 分配三个chunk,第三次分配将得到A
- 修改A的fd指针指向伪造的栈地址
- 分配两次,第二次将分配到栈上的伪造chunk
fastbin_dup_consolidate
利用步骤:
- 分配多个chunk填满tcache
- 释放一个chunk到fastbin
- 触发堆合并操作,使fastbin中的chunk进入unsorted bin
- 再次释放同一个chunk,实现双重释放
fast_bin_reverse_into_tcache
原理:
- 当fastbin中的chunk被重新分配时,剩余chunk会被放入tcache
- 通过控制fastbin链表,可以控制哪些chunk进入tcache
unsafe_unlink
unsafe_unlink是利用glibc中unlink操作的安全检查不足实现的利用技术。
概述
unlink操作用于从双向链表中移除一个chunk,当合并空闲chunk时会执行此操作。
出现场景
- 存在堆溢出,可以修改相邻chunk的元数据
- 可以控制被释放chunk的size和前后指针
利用步骤:
- 创建两个相邻的chunk(A, B)
- 溢出修改B的size和前后指针
- 释放B触发unlink操作
- 通过精心构造的指针实现任意地址写
tcache利用
tcache是glibc 2.26引入的线程本地缓存机制,提高了分配速度但也引入了新的攻击面。
tcache_poisoning
概述:
通过修改tcache中的fd指针,实现任意地址分配。
结构体:
struct tcache_entry {
void *next;
};
struct tcache_perthread_struct {
char counts[TCACHE_MAX_BINS];
tcache_entry *entries[TCACHE_MAX_BINS];
};
利用步骤:
- 分配两个相同大小的chunk(A, B)
- 释放A、B到tcache(形成B->A的链表)
- 通过漏洞修改A的fd指针指向目标地址
- 分配两次,第二次将分配到目标地址
tcache_stashing_unlink_attack
原理:
- 当smallbin中的chunk被分配时,剩余chunk会被放入tcache
- 通过控制smallbin的bk指针,可以在tcache中写入任意值
利用步骤:
- 创建多个chunk填满tcache
- 分配一个较大的chunk进入smallbin
- 修改smallbin的bk指针
- 触发分配操作,导致bk指针被写入tcache
总结
堆利用技术多种多样,关键在于理解glibc堆管理器的内部机制。掌握这些基础技术后,可以组合使用它们来应对更复杂的现实场景。随着glibc版本的更新,一些技术可能会失效,但基本原理仍然值得学习。