首页
社区
课程
招聘
[分享][ malloc 学习] 从 plaidctf 2015 plaiddb 学习 small size chunk 分配
2024-3-7 09:44 1157

[分享][ malloc 学习] 从 plaidctf 2015 plaiddb 学习 small size chunk 分配

2024-3-7 09:44
1157

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,符合理解


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-3-7 09:56 被tom996226编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回