当前位置: 首页 > news >正文

堆学习之glibc2.31下的tcache机制

0x2 tcache机制

0x1 tcache是什么

· tcache是满足一定条件的chunk被free后首先进入的bin,在2.31版本中一个tcachebin最多存储7个chunk,使用单链表头插法。在64位系统下,不同的tcachebin可存储的chunk的大小范围如下:idx0对应0-24字节,idx1对应25-40字节,idx2对应41-56字节。

0x2 chunk进入tcache的变化

· chunk进入tcache后,user_data的前两个槽位会发生变化。user_data+0x00写为next,指向tcache链表中的下一个chunk,如果链表为空则next也为null;user_data+0x08写为key,指向当前线程的tcache,标志当前chunk位于tcache链表中,也用于辅助double free检测。当前bin的头节点会指向新进入的chunk。注意:chunk进入tcache链表时并不是整个chunk在内存空间中移动,而是user_data的前两个槽位发生变化。chunk进入tcache的逻辑由tcache_put函数负责。

0x3 chunk离开tcache的变化

· chunk离开时,当前bin头节点指向next,即下一个chunk的user_data头。key被清空,标志chunk被使用。

0x4 tcache实例

· 使用如下实例:

#include <stdio.h>
#include <stdlib.h>int main() {setbuf(stdout, NULL);char *a = malloc(0x20);char *b = malloc(0x20);printf("a = %p\n", a);printf("b = %p\n", b);free(a);free(b);char *c = malloc(0x20);char *d = malloc(0x20);printf("c = %p\n", c);printf("d = %p\n", d);return 0;
}

· 两次malloc后chunk状态:

· free(a)后:

可以看到a确实进入了tcache。

可以看到user_data+0x08变成了指针一样的东西,即key,指向tcache。

· free(b)后:

可以看到a与b此时都在tcache中,b的user_data的前两个槽位也都变成了指针,其中user_data+0x00变为next,指向a的user_date,user_data+0x08变为key,指向tcache。此时a与b的位置状态如下:

head-->b-->a-->NULL

· char *c = malloc(0x20)后:

可以看到b已经从链表中弹出,且key被清除,标志该chunk已离开链表。

· tcache被塞满的情况(使用如下实例):

#include <stdio.h> 
#include <stdlib.h> int main() { setbuf(stdout, NULL); char *a = malloc(0x20); char *b = malloc(0x20); char *c = malloc(0x20); char *d = malloc(0x20); char *e = malloc(0x20); char *f = malloc(0x20); char *g = malloc(0x20); char *h = malloc(0x20); free(a); free(b); free(c); free(d); free(e); free(f); free(g); free(h); return 0; 
}

· 8次free后:

可以看到存储0x30大小的tcachebin被填满,最多存储7个chunk,第8个chunk进入fastbin。

http://www.jsqmd.com/news/534839/

相关文章:

  • Android网络请求库终极对决:xUtils3 vs Retrofit 完整指南
  • Z-Image Atelier 生成原理浅析:从扩散模型到潜在空间的图像构建之旅
  • 眼图颜色解读指南:如何通过颜色分布快速诊断高速信号问题
  • Qt 数据QByteArray与QString高效转换实战技巧
  • 如何在现代环境中运行 Java Applet
  • 面试官:MySQL 唯一索引和主键索引的区别?(修订版)
  • Monolith技术解析:Rust实现网页完整保存的架构设计与应用实践
  • SafetyNet与Play Integrity绕过机制深度解析:实现原理与高级配置指南
  • 使用Yakit打BurpSuite靶场:认证篇(Authentication)
  • CVPR‘26 | LaS-Comp:20秒精准还原万物全貌!零样本3D补全提速3倍以上,精度暴涨27%
  • 2026年9款主流学术文献阅读工具测评:从文献管理到AI辅助精读全流程方案
  • 浙政钉免登与扫码登录,一个SpringBoot项目里如何优雅地同时搞定?
  • 嵌入式开发C语言开源项目精选与实战解析
  • IP6163光伏降压DC-DC芯片:MPPT硬件算法如何提升太阳能转换效率
  • DeepSeek/豆包写的论文怎么降AI率?详细降AIGC教程+工具使用指南 - 我要发一区
  • 如何用3个智能体协作,让你的工作效率提升10倍?
  • Smashing高级配置技巧:认证、模板语言与性能优化终极指南
  • STM32H750VB FDCAN实战:从经典CAN到10Mbps高速通信的迁移指南
  • macOs安装docker且在docker上部署nginx+php
  • 深度分析罗兰艺境全屋定制GEO技术案例,测评东莞B2B制造企业正好地产工程优化过程与效果验证 - 罗兰艺境GEO
  • 2026年3月解放碑居民楼下火锅环境分析,舒适就餐地!火锅厂家甄选实力品牌 - 品牌推荐师
  • 汽车零件分装报警系统(1)
  • Openblocks移动端适配终极指南:构建完美响应式应用的完整方案
  • 3步解锁罗技鼠标宏:让PUBG压枪变得像呼吸一样简单
  • Nacos 服务注册为什么默认是临时实例?
  • Pixel Fashion Atelier部署教程:Stable Diffusion像素时装工作站一键启动
  • 小红书内容采集神器XHS-Downloader:3种方式轻松获取无水印素材
  • 率零降AI工具新手教程:零基础也能快速降论文AIGC率 - 我要发一区
  • 比话降AI操作全流程教程:从上传论文到降AI率达标一步到位 - 我要发一区
  • 深入浅出Android12 SurfaceFinger:Layer创建与HWComposer的奥秘