unsorted bin
关于堆分配时的行为,有以下几点需要注意:
-
往 free chunk 链表添加新 chunk 时的顺序:
- glibc 的内存管理策略是,当 free 一个 chunk 时,会将其添加到对应 bin 的左侧(头部)。
- 也就是说,新 free 的 chunk 会被插入到链表的左边/头部。
-
从 free chunk 链表分配 chunk 时的顺序:
- 当 malloc 需要从 free chunk 链表中分配内存时,会优先选择链表右侧(尾部)的 chunk。
- 也就是说,malloc 会优先选择链表中较旧的 chunk 进行分配。
当unsorted bin只有一个被释放的堆时候
当有三个时候
如果我们伪造了如下堆内存
0xcbf000: 0x0000000000000000 0x00000000000000a1
0xcbf010: 0x0000000000000000 0x0000000000000091
0xcbf020: 0x00000000006020c8 0x00000000006020d0
0xcbf030: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf040: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf050: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf060: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf070: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf080: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf090: 0x4d4d4d4d4d4d4d4d 0x4d4d4d4d4d4d4d4d
0xcbf0a0: 0x0000000000000090 0x00000000000000a0
0xcbf0b0: 0x0000000a4d4d4d4d 0x0000000000000000
0xcbf0c0: 0x0000000000000000 0x0000000000000000
0xcbf0d0: 0x0000000000000000 0x0000000000000000
0xcbf0e0: 0x0000000000000000 0x0000000000000000
0xcbf0f0: 0x0000000000000000 0x0000000000000000
再次释放的时候,就会删除这个本来不存在的堆与底下的堆合并
如果这个地方是堆的指针列表,这个指针现在指向了其自身位置 - 0x18 当我们再次修改这个指针时就能覆盖其自身
总结
此漏洞可以使得任意地址指向其自身 -0x18 的位置