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