mmap overlapping chunks
https://github.com/shellphish/how2heap/blob/master/glibc_2.31/mmap_overlapping_chunks.c
https://maxwelldulin.com/BlogPost?post=6967456768
http://tukan.farm/2016/07/27/munmap-madness/
相关知识点:
1.mmap chunk size字段与普通chunk size意义一样,prev_size字段意义不一样,表示padding字节数(因mmap chunk以page_size对齐)
2.mmap chunk分配 起始值:mp_.mmap_threshold ,随着上一次free mmap chunk动态变化,取最大值,尽量减少mmap数量。
3.munmap free时,公式为:
block = victim_ptr - prev_size
size = prev_size + size
munmap(block,size)
通过修改size,可达到释放victim_ptr 之后的内存,通过修改pre_size,释放victim_ptr之前的内存。
4.munmap之后的内存,重新利用方式有几种:
a.调用malloc,重新mmap,注:大小上次free大小,跳过mp_.mmap_threshold检测
b.dlopen动态加载so
c.mmap大文件,如媒体文件
d.启动新线程,创建thread stack,默认大小为RLIMIT_STACK:8M
5.munmap目标利用点:
a.heap brk
b.可执行文本段
c.第三方so可执行文本段
d..got/.data/.bss段,其中.got段相对利用最容易,可以与symbol resovle结合,达到任意函数执行
e.其它mmap chunk,就像本case
f.其它 thread stack。
6.关于位置
kernel
stack
.mmap top
.libc
.mmap2
.mmap3
xxxx
.heap
.bss
.data
.text
https://maxwelldulin.com/BlogPost?post=6967456768 中总结:
开始是从高地址向低地址,到一定阶段后,从低地址向高地址,如此多次反复。这里画的是初始阶段。