2.34的key异或绕过

2.34引入
当tcachebin中
只有一个堆块的时候,key在堆块的fd位
如果有多个的话,key在tcachebin尾堆块的fd位,因为之前的fd会被加密,因为tcachebin堆指针异或加密
tcache key 校验机制
此处以libc-2.29源码文件malloc.c来进行机制介绍
tcache的分配位于__libc_malloc函数,相关代码:
1 | #if USE_TCACHE |
此处tbytes是请求的chunk大小,tc_idx是对应保存tcache链表数组的索引,申请操作中进行了一个检查:检查目标链表是不是空的,不是空的就分配
tcache的释放位于_int_free函数,相关代码:
1 | #if USE_TCACHE |
先判断e->key是不是tcache,是的话,就进入一个循环,遍历该chunk所在链表所有的chunk判断是否与释放的chunk地址一致,一致则相同
关于e->key为什么会是tcache,在tcache_put函数中有体现:
1 | /* Caller must ensure that we know tc_idx is valid and there's room |
该版本中,释放的chunk会将tcache写入key字段中,然后就是链表头插节点,数量加一
绕过分析
key校验机制的关键点有2个:校验key值,是否等于tcache结构体地址
- 不等于的话,就直接正常释放
- 等于的话,遍历对应大小的链表检查是否存在Double-Free
常规的绕过key机制的方式是修改key字段,常见通过Overflow或者UAF或者泄露来完成
heap_addr=key<<12
绕过方法
泄露
当存在uaf的时候,我们可以直接泄露key,就可以绕过
修改fd位:xor_free_hook=free_hook^key
1 | key=u64(p.recv(5).ljust(8,b'\x00')) |
例题
flag被读入0x4060,并给出pie_base
add,edit,show,free四个功能函数
2.35版本,uaf
uaf泄露出key之后tcachebin attack 将flag堆块申请出来,show就可以得到flag


1 | from pwn import* |
House of Karui
【我的 PWN 学习手札】House of Karui —— tcache key 绕过_tcache key怎么找-CSDN博客