【Heap.04】从源码分析和几道例题入门 musl-libc pwn
时间要是再多点就好了,我能避免许多遗憾。
什么是 musl ?
musl,一种C标准库,主要使用于以Linux内核为主的操作系统上,目标为嵌入式系统与移动设备。开发此库的目的是写一份干净、高效、符合标准的C标准库。
为啥要学 musl ?glibc 玩明白了?
💢 没玩明白呢还。原因一个是最近的比赛( *ctf )接触到了 musl ,想学习一下,算是拓展知识面提升自己了。另外 musl 和 glibc 肯定有相同的地方,况且 🐮 🅱 的 glibc 还有漏洞呢, musl 的洞岂不是也不会少,乐观点。最后,盯着各种各样奇奇怪怪的代码去 exploit 很炫酷的欧尅?一 一✧
前言
musl 1.2.2 版本源码相比较 1.1.x 有较大变动,这里先从师傅们的文章学习一下 1.2.2 ,其他的以后再来补。
源码分析
关键数据结构
先认识一下几个结构体:
chunk
源码中并没有显式地定义出 chunk 结构体,实际上其结构为:
1 | struct chunk |
group
malloc/mallocng/meta.h
1 | // meta 管理 group |
meta
malloc/mallocng/meta.h
1 | // meta 管理 group |
meta_area
malloc/mallocng/meta.h
1 | // 单独申请一个内存页,页起始地址为一个 struct meta_area 结构,该内存页剩下的部分就是一个个 meta |
malloc_context
malloc/mallocng/meta.h
1 | struct malloc_context { |
Musl-mallocng 部分源码分析
size_to_class
计算出来的 size_class 与 malloc_context 中的 active[48]
对应。
1 |
|
计算完大概是:
1 | 0x0 ~ 0xc ->0 |
malloc
malloc/mallocng/malloc.c
1 | void *malloc(size_t n) |
alloc_slot
1 | // 当 malloc 时初步发现 ctx.active[sc] 没有 avail 的 chunk |
try_avail
1 | // try_avail(&ctx.active[sc]) |
alloc_slot
1 | static int alloc_slot(int, size_t); |
1 | $10 = { |
Exploit
主要是 dequeque 和 FSOP 的利用,先欠着(好吧其实是太菜了不会以后学)
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 uuu!
评论