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_gadgetsystem等函数地址实现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基址

  1. 申请多个大chunk(大于tcache范围,如0x500)
  2. 释放其中一个chunk进入unsorted bin
  3. 重新申请该chunk,利用unsorted bin残留指针泄露main_arena地址
  4. 计算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_结构体

  1. 计算mp_结构体地址:mp = libc_base + 0x1ec280 + 0x50
    • 0x1ec280是mp_结构体相对于libc的偏移
    • +0x50tcache_bins成员在结构体中的偏移
  2. 使用edit功能将mp_.tcache_bins修改为666666
edit(p64(mp))         # 修改mp_.tcache_bins为666666

3.3 利用修改后的tcache机制

  1. 释放一个大chunk(如chunk 3),此时它会尝试进入tcache
  2. 由于tcache_bins被扩大,大chunk可以进入tcache
  3. 该chunk的地址会被存储在相邻chunk(通常是chunk 0)的特定位置
dele(3)               # 释放chunk 3,其地址会被存储在chunk 0中
dele(0)               # 释放chunk 0以便重新控制

3.4 劫持控制流

  1. 重新申请chunk 0,覆盖其内容为free_hook地址
  2. 再申请chunk 3,将其内容覆盖为system地址
  3. 此时调用free实际会调用system
add(0x500, b'\x00'*0x68 + p64(free_hook)) # chunk 0
add(0x500, p64(system))                  # chunk 3

3.5 触发shell

  1. 由于chunk 1中已写入/bin/sh\x00
  2. 释放chunk 1会触发system("/bin/sh")
dele(1)               # 触发system("/bin/sh")

4. 关键点总结

  1. chunk大小选择:必须大于默认tcache范围(>0x410),通常选择0x500
  2. libc泄露:利用unsorted bin的指针残留特性
  3. mp_结构体定位:需要知道libc中mp_结构体和tcache_bins的偏移
  4. 地址存储机制:大chunk的tcache链表头会存储在相邻chunk中
  5. 控制流劫持:通过覆盖相邻chunk内容实现任意地址写

5. 防御措施

  1. 更新glibc版本,修复相关漏洞
  2. 使用堆保护机制如FORTIFY_SOURCE
  3. 限制对关键内存区域的写操作
  4. 实现堆隔离,防止关键数据结构被篡改

6. 实际调试技巧

  1. 使用gdb查看mp_结构体:
    p mp_
    x/20gx &mp_
    
  2. 检查tcache_bins值:
    p mp_.tcache_bins
    
  3. 跟踪chunk释放过程:
    break _int_free
    
  4. 检查free_hook状态:
    p __free_hook
    

通过以上步骤和技巧,可以完整实现mp_结构体攻击,并深入理解其工作原理。

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数据段。关键成员包括: tcache_bins 默认值为64,意味着只有大小在0x20-0x410的chunk可以进入tcache 修改此值可以扩大tcache的适用范围 3. 攻击步骤详解 3.1 泄露libc基址 申请多个大chunk(大于tcache范围,如0x500) 释放其中一个chunk进入unsorted bin 重新申请该chunk,利用unsorted bin残留指针泄露main_ arena地址 计算libc基址 3.2 定位并修改mp_ 结构体 计算mp_ 结构体地址: mp = libc_base + 0x1ec280 + 0x50 0x1ec280 是mp_ 结构体相对于libc的偏移 +0x50 是 tcache_bins 成员在结构体中的偏移 使用edit功能将 mp_.tcache_bins 修改为666666 3.3 利用修改后的tcache机制 释放一个大chunk(如chunk 3),此时它会尝试进入tcache 由于 tcache_bins 被扩大,大chunk可以进入tcache 该chunk的地址会被存储在相邻chunk(通常是chunk 0)的特定位置 3.4 劫持控制流 重新申请chunk 0,覆盖其内容为 free_hook 地址 再申请chunk 3,将其内容覆盖为 system 地址 此时调用 free 实际会调用 system 3.5 触发shell 由于chunk 1中已写入 /bin/sh\x00 释放chunk 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_ 结构体: 检查tcache_ bins值: 跟踪chunk释放过程: 检查free_ hook状态: 通过以上步骤和技巧,可以完整实现mp_ 结构体攻击,并深入理解其工作原理。