跟上时代之高版本GLIBC下堆利用(二)
字数 2046 2025-08-07 08:22:33

高版本GLIBC下堆利用:Tcache Stashing Unlink Attack详解

0x00 前言

在GLIBC 2.29及更高版本中,传统的unlink利用方式受到越来越多的保护机制限制。本文将详细介绍一种更高效的堆利用技术——Tcache Stashing Unlink Attack,它能够实现任意地址写指定值或任意地址分配chunk,进而实现任意地址读写。

0x01 技术概述

Tcache Stashing Unlink Attack是一种利用smallbin分配机制的漏洞利用技术,它源于对House of Lore攻击技术的改进和扩展。该技术通过操纵smallbin的bk指针,结合tcache机制的特性,实现更灵活的堆利用。

0x02 前置知识:House of Lore

利用思想

House of Lore是一种针对smallbin机制的利用技术。通过修改smallbin头chunk的bk指针指向伪造的fake_chunk,并确保伪造的chunk能够通过安全检查,从而在后续内存分配时分配到伪造的chunk。

原理分析

smallbin范围内的堆块分配流程如下:

  1. 获取smallbin索引和对应bin指针
  2. 获取smallbin的最后一个chunk(victim)
  3. 检查双向链表完整性:bck->fd == victim
  4. 设置inuse位
  5. 修改smallbin链表,取出victim
  6. 返回分配的内存

关键漏洞点在于:如果能够控制smallbin头chunk的bk指针并伪造fake_chunk,且通过安全检查,就能在后续分配中获取到伪造的chunk。

利用条件

  1. 能够申请或获得smallbin大小的chunk
  2. 能够控制smallbin的bk指针
  3. 能够提前布置fake_chunk并指向smallbin头部
  4. fake_chunk能够通过fd检查:bck->fd == victim

0x03 Tcache Stashing Unlink Attack详解

利用条件

  1. 能够控制smallbin chunk的bk指针
  2. 程序可以跳过tcache bin申请chunk(通常使用calloc函数)
  3. 能够分配两种或以上unsorted bin大小的堆块

利用目的

  1. 向任意指定位置写入可控的值
  2. 实现任意地址分配chunk(任意地址读写)

核心原理

在glibc 2.29+中,当使用calloc分配内存时,如果对应大小的tcache bin不为空但未满,且smallbin中有可用chunk,系统会将smallbin中的chunk转移到tcache bin中。在这个过程中:

  1. 对第一个从smallbin取出的chunk会进行完整性检查
  2. 后续转移到tcache bin的chunk则没有完整性检查
  3. 通过控制smallbin的bk指针,可以实现任意地址写libc地址或分配fake_chunk

关键代码片段:

while (tcache->counts[tc_idx] < mp_.tcache_count 
       && (tc_victim = last(bin)) != bin) {
    if (tc_victim != 0) {
        bck = tc_victim->bk;
        set_inuse_bit_at_offset(tc_victim, nb);
        bin->bk = bck;
        bck->fd = bin;  // 关键点:可以实现任意地址写
        tcache_put(tc_victim, tc_idx);
    }
}

利用步骤

  1. 填满对应大小的tcache bin
  2. 创建两个相同大小的smallbin chunk
  3. 修改第一个smallbin chunk的bk指针指向目标地址
  4. 使用calloc触发分配,将伪造的chunk链入tcache
  5. 从tcache中分配得到目标地址的chunk

0x04 实战案例:[BUUOJ-2020 新春红包题-3]

程序分析

  1. 保护机制:除canary外全开
  2. 功能:增删查改
  3. 漏洞:free后未置零指针(UAF)
  4. 关键点:使用calloc分配堆块(不从tcache取)
  5. 沙箱限制

利用过程

  1. 泄露堆地址

    • 填满tcache bin后释放chunk
    • 通过show功能泄露heap地址
  2. 泄露libc地址

    • 创建unsorted bin chunk
    • 通过show功能泄露main_arena地址
  3. 构造ORW链

    • 准备ROP链实现open/read/puts
    • 设置flag文件路径
  4. 实施Tcache Stashing Unlink Attack

    • 创建两个0x100大小的smallbin chunk
    • 修改第一个smallbin的bk指针指向目标地址
    • 使用calloc触发攻击
  5. 栈迁移执行ORW

    • 通过覆盖返回地址实现栈迁移
    • 执行构造的ORW链读取flag

关键代码片段

# 构造smallbin链
add(0, 3, 'a')
add(0, 4, 'b')
add(1, 4, 'a')
delete(0)
add(1, 3, 'a')
add(1, 4, 'b')

# 修改bk指针
pl = 'a'*0x300
pl += p64(0) + p64(0x101)  # 伪造chunk头
pl += p64(heap_addr + 0x1F70)  # fd保持链表完整
pl += p64(heap_addr - 0x1010 + 0x800 - 0x10)  # 目标地址
edit(0, pl)

# 触发攻击
add(2, 0xF0, orw)

0x05 总结

Tcache Stashing Unlink Attack是高版本glibc下一种有效的堆利用技术,相比传统unlink具有以下优势:

  1. 绕过更多保护机制
  2. 可实现任意地址写和任意地址分配
  3. 结合calloc特性,利用条件相对可控

在实际利用中需要注意:

  • 确保tcache bin状态符合要求
  • 精确控制smallbin的bk指针
  • 伪造的chunk结构要满足基本要求

0x06 参考链接

  1. 好好说话之Tcache Attack(3):tcache stashing unlink attack
  2. GLIBC源码分析:glibc-2.29/malloc/malloc.c
高版本GLIBC下堆利用:Tcache Stashing Unlink Attack详解 0x00 前言 在GLIBC 2.29及更高版本中,传统的unlink利用方式受到越来越多的保护机制限制。本文将详细介绍一种更高效的堆利用技术——Tcache Stashing Unlink Attack,它能够实现任意地址写指定值或任意地址分配chunk,进而实现任意地址读写。 0x01 技术概述 Tcache Stashing Unlink Attack是一种利用smallbin分配机制的漏洞利用技术,它源于对House of Lore攻击技术的改进和扩展。该技术通过操纵smallbin的bk指针,结合tcache机制的特性,实现更灵活的堆利用。 0x02 前置知识:House of Lore 利用思想 House of Lore是一种针对smallbin机制的利用技术。通过修改smallbin头chunk的bk指针指向伪造的fake_ chunk,并确保伪造的chunk能够通过安全检查,从而在后续内存分配时分配到伪造的chunk。 原理分析 smallbin范围内的堆块分配流程如下: 获取smallbin索引和对应bin指针 获取smallbin的最后一个chunk(victim) 检查双向链表完整性: bck->fd == victim 设置inuse位 修改smallbin链表,取出victim 返回分配的内存 关键漏洞点在于:如果能够控制smallbin头chunk的bk指针并伪造fake_ chunk,且通过安全检查,就能在后续分配中获取到伪造的chunk。 利用条件 能够申请或获得smallbin大小的chunk 能够控制smallbin的bk指针 能够提前布置fake_ chunk并指向smallbin头部 fake_ chunk能够通过fd检查: bck->fd == victim 0x03 Tcache Stashing Unlink Attack详解 利用条件 能够控制smallbin chunk的bk指针 程序可以跳过tcache bin申请chunk(通常使用calloc函数) 能够分配两种或以上unsorted bin大小的堆块 利用目的 向任意指定位置写入可控的值 实现任意地址分配chunk(任意地址读写) 核心原理 在glibc 2.29+中,当使用calloc分配内存时,如果对应大小的tcache bin不为空但未满,且smallbin中有可用chunk,系统会将smallbin中的chunk转移到tcache bin中。在这个过程中: 对第一个从smallbin取出的chunk会进行完整性检查 后续转移到tcache bin的chunk则没有完整性检查 通过控制smallbin的bk指针,可以实现任意地址写libc地址或分配fake_ chunk 关键代码片段: 利用步骤 填满对应大小的tcache bin 创建两个相同大小的smallbin chunk 修改第一个smallbin chunk的bk指针指向目标地址 使用calloc触发分配,将伪造的chunk链入tcache 从tcache中分配得到目标地址的chunk 0x04 实战案例:[ BUUOJ-2020 新春红包题-3 ] 程序分析 保护机制:除canary外全开 功能:增删查改 漏洞:free后未置零指针(UAF) 关键点:使用calloc分配堆块(不从tcache取) 沙箱限制 利用过程 泄露堆地址 : 填满tcache bin后释放chunk 通过show功能泄露heap地址 泄露libc地址 : 创建unsorted bin chunk 通过show功能泄露main_ arena地址 构造ORW链 : 准备ROP链实现open/read/puts 设置flag文件路径 实施Tcache Stashing Unlink Attack : 创建两个0x100大小的smallbin chunk 修改第一个smallbin的bk指针指向目标地址 使用calloc触发攻击 栈迁移执行ORW : 通过覆盖返回地址实现栈迁移 执行构造的ORW链读取flag 关键代码片段 0x05 总结 Tcache Stashing Unlink Attack是高版本glibc下一种有效的堆利用技术,相比传统unlink具有以下优势: 绕过更多保护机制 可实现任意地址写和任意地址分配 结合calloc特性,利用条件相对可控 在实际利用中需要注意: 确保tcache bin状态符合要求 精确控制smallbin的bk指针 伪造的chunk结构要满足基本要求 0x06 参考链接 好好说话之Tcache Attack(3):tcache stashing unlink attack GLIBC源码分析:glibc-2.29/malloc/malloc.c