-
-
[分享][ malloc 学习] 从 plaidctf 2015 plaiddb 学习 small size chunk 分配
-
发表于: 2024-3-7 09:44 1458
-
plaidctf 2015 plaiddb 这道题在 ctf-wiki 上说的很清楚,这里主要来分享下我在调试过程中对 malloc 分配过程 的学习
申请 small bin
在 exp 中下一个 raw_input(),下一步将 malloc(0x200)
此时 bin 情况
可以看到 unsortedbin 中有 size 为 0x5e1 的 chunk,smallbin 中有 size 为 0x360 的 chunk
下一步 malloc(0x200) 时,将从哪里获取 chunk 呢
一步步来分析:
- 当申请内存大小为 small size 时,首先将从 smallbin 中查看有没有大小正好一致的。这里没有
- 接下来从 unsortedbin->bk 开始查看有没有和申请内存大小正好一致的,如果不是正好一致,则放入 smallbin 或 largebin 中。这里有一个特殊情况,即申请内存大小为 small size 时,首先考虑 reminder:
- 如果 unsortedbin 中有且仅有一个 chunk
- 并且这个 chunk 是 reminder(即上一次切割某 chunk 后留下来的 chunk)
- 而且这个 reminder 切割我们申请内存大小后仍然可以作为一个 chunk (即大于 MINSIZE),那么就切割这个 reminder 并返回
- 如果上一步进行完后仍不满足,则直接从 binmap 中寻找比申请内存刚好大的 bin,进行分割,将剩余部分放到 reminder 中(我对这一步研究不够深入,如有错误,烦请指正)
- 如果 bin 中没有能满足的,则从 top chunk 中分割。注意如果 top chunk 大小也不满足,则会对 fastbin 通过 malloc_consolidate 进行合并
看看有没有 reminder
有 reminder,但是是 0x561076769ac0,和 unsortedbin 中唯一的 chunk 并不一致,所以 small size chunk 无法从 reminder 中分配
所以最后只能通过 binmap 按照 best-fit 分配,也就是分割 0x360 大小的 smallbin
最后 reminder 为 0x360 - 0x210 = 0x150 大小的 chunk,且在 unsortedbin 中;unsortedbin 中 size 为 0x5e1 的 chunk 被放到 largebin 中
继续执行 exp
和我们的理解一致
从 reminder 中分配 smallbin
在 exp 中下一个 raw_input(),下一步将 malloc(0x100)
此时 bin 情况
有 0x3d1 大小的 unsortedbin,0x150 大小的 smallbin
查看 reminder
可以看到 unsortedbin 中有且仅有一个 chunk 且为 reminder,大小也够分割,所以将从 reminder 中分配
继续执行
可以看到 reminder 大小变成了 0x3d1 - 0x110 = 0x2c1,符合理解
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)