ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

malloc 调测之查看 Fastbin 链表

malloc 调测之查看 Fastbin 链表 一、查看 Fastbin 链表Fastbin 与bins数组不同它由malloc_state中的独立字段管理。在 GDB 中查看 Fastbin 链表关键是找到它的头指针数组。1. 找到 Fastbin 的存储位置在较新版本的 Glibc 中Fastbin 的头指针存储在malloc_state的fastbinsY字段中部分版本可能通过宏或全局变量访问。可以这样定位# 查看 main_arena 的 fastbinsY 数组 (gdb) p main_arena.fastbinsY $1 {0x0, 0x0, 0x804b080, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}数组中有 10 个元素64 位系统每个元素是一个mfastbinptr指向对应大小的 Fastbin 链表头。如果为0x0说明该链表为空。2. 理解 Fastbin 的大小映射Fastbin 的索引与 chunk 大小的对应关系是索引chunk 大小 (64位)索引chunk 大小 (64位)fastbinsY[0]32 字节fastbinsY[5]112 字节fastbinsY[1]48 字节fastbinsY[6]128 字节fastbinsY[2]64 字节fastbinsY[7]144 字节fastbinsY[3]80 字节fastbinsY[8]160 字节fastbinsY[4]96 字节fastbinsY[9]176 字节计算公式chunk_size (索引 2) * 1664 位系统。3. 遍历 Fastbin 链表Fastbin 是单向链表只通过fd指针链接。假设fastbinsY[2] 0x804b080来遍历它# 查看第一个节点的 fd 指针 (gdb) x/2gx 0x804b080 0x804b080: 0x00000000 0x00000041 # prev_size, size (0x41 64字节标志位) 0x804b090: 0x0804b0c0 0x00000000 # fd 0x804b0c0 (下一个节点), bk 未使用 # 继续查看下一个节点 (gdb) x/2gx 0x804b0c0 0x804b0c0: 0x00000000 0x00000041 0x804b0d0: 0x00000000 0x00000000 # fd 0x0链表结束遍历终止条件当fd为0x0时说明到达链表尾部。4. 自动化遍历脚本define walk_fastbin set $idx 2 set $head main_arena.fastbinsY[$idx] printf Fastbin[%d] (chunk size %d):\n, $idx, ($idx 2) * 16 while $head ! 0 printf chunk %p, size 0x%lx\n, $head, *(size_t*)($head 4) ~0x7 set $head *(size_t*)($head 8) # fd 指针 end end在 GDB 中执行walk_fastbin就能自动打印指定索引的 Fastbin 链表。5. 其他版本的注意事项在部分 Glibc 版本如 2.27中fastbinsY可能不直接暴露在malloc_state中。可以尝试# 直接查看 fastbin 数组的地址 (gdb) p main_arena.fastbinsY如果失败可以尝试通过main_arena的偏移量手动计算或者使用 Pwndbg 插件的fastbins命令它会自动解析并展示所有 Fastbin 链表。
返回列表