跟上时代之高版本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范围内的堆块分配流程如下:
- 获取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
关键代码片段:
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);
}
}
利用步骤
- 填满对应大小的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
关键代码片段
# 构造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具有以下优势:
- 绕过更多保护机制
- 可实现任意地址写和任意地址分配
- 结合calloc特性,利用条件相对可控
在实际利用中需要注意:
- 确保tcache bin状态符合要求
- 精确控制smallbin的bk指针
- 伪造的chunk结构要满足基本要求
0x06 参考链接
- 好好说话之Tcache Attack(3):tcache stashing unlink attack
- GLIBC源码分析:glibc-2.29/malloc/malloc.c