多申请
add_chunk(5, 0x208)
👉 是为了当作 “隔离块(guard chunk)”,
防止 chunk4 在 free 时继续向后合并(top chunk 或其他 chunk)
🔥 一、先看你这题的堆布局
chunk3 (0x208) ← 用来伪造 fake chunk
chunk4 (0x1f8) ← 触发 unlink
chunk5 (0x208) ← 保护用(关键!)
💣 二、free(chunk4) 时会发生什么?
在 glibc 中:
free(chunk4)
会检查两边:
✅ 向前合并(你想要的)
如果 prev_inuse = 0
→ 和 chunk3(fake chunk)合并
→ 触发 unlink ✅
⚠️ 向后合并(你不想要的)
如果 chunk5 是 free
或者 chunk5 是 top chunk
→ chunk4 会继续向后合并 ❌
❗ 三、不加 chunk5 会怎样?
情况1:chunk4 后面是 top chunk
chunk3 | chunk4 | top chunk
👉 free(chunk4) 时:
chunk4 + top chunk 合并 ❌
结果:
- ❌ 不会走 unlink
- ❌ fake chunk 用不上
- ❌ exploit 直接失败
情况2:chunk4 后面也是 free chunk
👉 会发生:
向前合并 + 向后合并
👉 结构被破坏,unlink 不可控 ❌
🛡️ 四、chunk5 的作用(核心)
add_chunk(5, 0x208)
👉 保证:
chunk5 = inuse(已分配)
于是:
chunk3 | chunk4 | chunk5
↑ free
结果:
✔ 向前:
chunk4 → fake chunk(chunk3)
→ unlink ✅
❌ 向后:
chunk5 是 inuse
→ 不能合并 ✅(我们想要的)
🎯 五、这就叫“防止合并”
👉 更准确说是:
防止 chunk4 向后合并(forward consolidation)
🧩 六、总结一句话(记住这个)
chunk5 的作用 = 卡住 chunk4 的后面,
让 free(chunk4) 时只发生“向前合并”,从而触发 unlink
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 perplex(pwner)!


