手把手带你搞懂堆利用套路
字数 1599 2025-08-29 22:41:24

堆利用套路详解

前言

堆利用是二进制安全领域中的重要技术,掌握各种堆利用技巧对于漏洞分析和利用至关重要。本文将系统性地介绍多种堆利用技术,包括UAF、first_fit、fastbin_dup、unsafe_unlink和tcache等利用方法。

UAF (Use After Free)

UAF是指释放后的内存被继续使用的情况,这是最常见的堆漏洞类型之一。

利用要点:

  • 在对象被释放后,指针未被清空
  • 程序继续使用这个悬垂指针
  • 通过重新分配相同大小的内存块来控制原指针指向的内容

利用步骤:

  1. 分配一个对象A
  2. 释放对象A但不清空指针
  3. 分配对象B,大小与A相同,占据A原来的内存空间
  4. 通过原指针操作A,实际上是操作B的内存

first_fit

first_fit是glibc堆分配器的基本策略,指分配器会从空闲列表中找到第一个足够大的块进行分配。

利用要点:

  • 了解glibc的分配策略
  • 控制堆布局,使目标块成为第一个满足条件的空闲块
  • 常用于结合其他漏洞实现更复杂的利用

fastbin_dup

fastbin_dup是利用fastbin的单链表特性实现的双重释放漏洞。

fastbin_dup_into_stack

利用步骤:

  1. 分配三个相同大小的chunk(A, B, C)
  2. 释放A、B、A(形成A->B->A的fastbin链表)
  3. 分配三个chunk,第三次分配将得到A
  4. 修改A的fd指针指向伪造的栈地址
  5. 分配两次,第二次将分配到栈上的伪造chunk

fastbin_dup_consolidate

利用步骤:

  1. 分配多个chunk填满tcache
  2. 释放一个chunk到fastbin
  3. 触发堆合并操作,使fastbin中的chunk进入unsorted bin
  4. 再次释放同一个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和前后指针

利用步骤:

  1. 创建两个相邻的chunk(A, B)
  2. 溢出修改B的size和前后指针
  3. 释放B触发unlink操作
  4. 通过精心构造的指针实现任意地址写

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];
};

利用步骤:

  1. 分配两个相同大小的chunk(A, B)
  2. 释放A、B到tcache(形成B->A的链表)
  3. 通过漏洞修改A的fd指针指向目标地址
  4. 分配两次,第二次将分配到目标地址

tcache_stashing_unlink_attack

原理:

  • 当smallbin中的chunk被分配时,剩余chunk会被放入tcache
  • 通过控制smallbin的bk指针,可以在tcache中写入任意值

利用步骤:

  1. 创建多个chunk填满tcache
  2. 分配一个较大的chunk进入smallbin
  3. 修改smallbin的bk指针
  4. 触发分配操作,导致bk指针被写入tcache

总结

堆利用技术多种多样,关键在于理解glibc堆管理器的内部机制。掌握这些基础技术后,可以组合使用它们来应对更复杂的现实场景。随着glibc版本的更新,一些技术可能会失效,但基本原理仍然值得学习。

堆利用套路详解 前言 堆利用是二进制安全领域中的重要技术,掌握各种堆利用技巧对于漏洞分析和利用至关重要。本文将系统性地介绍多种堆利用技术,包括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指针,实现任意地址分配。 结构体: 利用步骤: 分配两个相同大小的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版本的更新,一些技术可能会失效,但基本原理仍然值得学习。