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

堆学习之glibc2.31下的unsorted bin机制

0x1 unsorted bin是什么

· free时,若chunk的大小能进tcache且tcache没满,则进tcache;若大小能进fastbin且tcache已满,则进fastbin;若既不进tcache又不进fastbin,则通常进unsorted bin

· unsorted bin相当于一个临时中转站,很多free出来的chunk在进入各个bin之前会先进入这个中转站。之后的malloc会优先到unsorted bin中寻找合适的chunk,不合适的chunk会被分流到smallbin/largebin。

· 与tcache不同,unsorted bin使用双向链表。进入unsorted bin的chunk的user_data+0x00会写成fd,指向链表中的下一个chunk;user_data+0x08会写成bk,指向链表中的上一个chunk(以进入unsorted bin的先后顺序为前后顺序)。若前面或后面没有chunk,则fd/bk指向head。head在main_arena中,main_arena是libc中的malloc核心管理结构,所以head会是一个libc地址。

0x2 unsorted bin实例

· 使用如下实例:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <unistd.h> int main() { setbuf(stdin, NULL); setbuf(stdout, NULL); setbuf(stderr, NULL); char *a = malloc(0x420); char *b = malloc(0x420); char *c = malloc(0x420); char *d = malloc(0x20); free(a); free(b); free(c); return 0; 
}

· 四次malloc后,先看一下四个chunk的user_date地址:

· 第一次free后:

可以看到chunk_a已进入unsorted bin,且链表中写入的是chunk_head而不是user_data地址。由于a是bin中唯一一个chunk,它的fd和bk就都指向head。

· 三次free后:

可以看到unsorted bin中仍然只有chunk_a,而chunk_b和chunk_c不知所踪,chunk_a的fd和bk仍然都指向head,chunk_b和chunk_c也没有写入fd/bk,为什么?

因为chunk_a,b,c是一段连续的内存区域的三个chunk,一个chunk被free进unsorted bin时,glibc会先后检查与他物理相邻的上一个与下一个chunk是否处与使用状态,若相邻chunk处于空闲状态则glibc会将两个chunk进行合并。所以由于chunk_b被free时chunk_a空闲、chunk_c使用中,chunk_a就被chunk_b向下合并,成为一块chunk。chunk_c被free时同理,导致三个chunk最终成为一个chunk,所以unsorted bin中只有chunk_a的地址。

注意:发生合并是相邻的两个chunk只需满足“都处于空闲状态”与“物理相邻”两个条件,不需要都位于unsorted bin链表中。合并过程中,若相邻chunk位于其他bin,则其会被从其原本bin中摘出来再与该chunk合并,合并后的结果一般会重新挂回unsorted bin,除非直接并进top。fastbin除外。

· 现在来看下面这个实例:

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

· 四次free后:

可以看到这次被free的四个chunk都进入了unsorted bin链表,且按照进入bin的先后顺序使用fd/bk相互连接。

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

相关文章:

  • 汽车零件分装报警系统(2)
  • SVG 写的 DICOM C-MOVE 过程展示
  • DeepSeek-OCR-2零售行业应用:商品标签识别系统实现
  • 智能车越野组硬件设计实战:基于逐飞TC264的主板与无刷驱动板DIY全记录
  • 告别Xcode项目配置冲突:XcodeGen如何重构iOS团队协作开发范式
  • Windows Server 2008 R2提权实战:用MS15-051漏洞从WebShell到System权限的完整操作记录
  • WinRAR(老牌压缩软件) v7.20 / 7.21 Beta1 x64 烈火汉化版
  • AI视觉文本技术终极指南:如何让AI看懂图片中的文字
  • Git Updater安全配置:如何保护你的访问令牌和API密钥
  • 毕业论文降AI率保姆级攻略:3步降到15%以下顺利通过检测 - 我要发一区
  • 5个维度打造你的专属音乐中心:开源音乐播放器MusicFree全解析
  • Qwen3-ASR在在线教育平台的应用:课件语音搜索系统
  • 智能客服场景落地:集成万象熔炉·丹青幻境的对话式AI助手开发
  • Halcon实战:用shape_trans算子5分钟搞定不规则区域的最小外接矩形提取
  • cleartext-mac应用场景指南:在工作和生活中如何发挥最大价值
  • 内科/外科主治备考速通:两位科室专属铭师,让提分不走弯路 - 医考机构品牌测评专家
  • MINDS-i-Common:教育机器人中的速率可控舵机框架
  • BIThesis解决书脊排版问题的动态布局优化方案
  • 如何构建可重用组件:Openblocks模块与查询库终极指南
  • FLUX.1-devAI应用实践:结合RAG构建设计师智能提示词助手
  • 如何提升漫画下载效率?PicAComic Downloader的全方位解决方案
  • 5个Kubernetes网络策略常见误区:从Network Policy Recipes中学习正确配置
  • 阿虎白卷深度测评:精准押考点+高效提分,晋高冲刺优选 - 医考机构品牌测评专家
  • 从“Root大师”到Magisk:一个安卓小白的踩坑实录与工具进化史
  • 测试0031
  • Nanobot知识图谱:Neo4j数据库集成指南
  • Tailwind+AI前端开发指南:用ChatGPT快速生成响应式登录页(附完整prompt模板)
  • 【南京理工大学、中国人工智能学会智能检测与运动控制技术专业委员会联合主办 |ACM(有ISBN号)出版,EI、Scopus检索】2026年智能检测与运动控制技术国际会议(IDMCT 2026)
  • UnrealCLR异常处理与调试:为什么这是.NET开发者必须掌握的技能
  • 告别字体混乱:TexStudio+Mactex2022中文字体配置全攻略(Mac版)