How2heap学习笔记-4
overlapping_chunks
利用修改空闲块的size位造成堆块重叠
示例代码
1 | /* |
分析
申请三个堆块
- malloc(0x100-8) chunk a
- malloc(0x100-8) chunk b
- malloc(0x80-8) chunk c
释放chunk b
- free(b)
修改chunk b的size位为0x181(b.size+c.size)
再申请相应大小的chunk d
- malloc(0x180-8)
即可造成chunk c被chunk d包含的结果
overlapping_chunks_2
利用修改使用中chunk的size位配合另一空闲的chunk和前向合并造成堆块重叠
示例代码
1 | /* |
分析
申请堆块
- malloc(1000) a
- malloc(1000) b
- malloc(1000) c
- malloc(1000) d
- malloc(1000) e
释放chunk d
- free(d)
修改chunk b的size位为b.size+c.size
释放chunkb
- free(b)
此时程序会根据chunk b的size位找到前一个chunk d
发现chunk d处于空闲状态且不是top chunk
发生前向合并
合并后的chunk放入unsorted bin中
而这里被放入unsorted bin中的chunk大小已经是b.size+c.size+d.size了,而chunk c并没有被释放(0xbd1 = 0x3f0\*3 + 1(inuse))
效果:1
2
3
4
5Free chunk (unsortedbin) | PREV_INUSE
Addr: 0x6033f0
Size: 0xbd1
fd: 0x7ffff7dd1b78
bk: 0x7ffff7dd1b78
接下来再申请相应大小的堆
- malloc(2000) e
此时chunk e=chunk b+chunk c,与chunk c发生重叠
mmap_overlapping_chunks
造成特大堆块(mmap分配的chunk)的重叠
示例代码
1 | #include <stdlib.h> |
分析
申请三个特大的chunk
- malloc(0x100000)*3
此时会用mmap分配空间
申请好后的三个chunk size均为0x101002
空间分布如下1
2
3
4
5
6
7
8
9
10
11
12Current System Memory Layout
================================================
running program
heap
....
third mmap chunk
second mmap chunk
LibC
....
ld
first mmap chunk
===============================================
接下来假设存在一个堆溢出漏洞
修改third chunk的size为0x202002(2*0x101002)
接下来free(third chunk),实际执行了munmap
然后需要再申请一个比0x202002更大的区域
- malloc(0x300000)
这时就能得到一块内存区域,包含了实际上未被释放的second mmap chunk
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 aYoung's Blog!
评论




