House Of Einherjar
October 30, 2019 PWN 访问: 24 次
这个技术主要用来使程序的堆块重叠
利用的知识点是堆块向低地址合并
glibc源码分析:(glibc-2.23/malloc/malloc.c:4003
)
/* consolidate backward */
if (!prev_inuse(p)) {
prevsize = p->prev_size;
size += prevsize;
p = chunk_at_offset(p, -((long) prevsize));
unlink(av, p, bck, fwd);
}
当free一个chunk的时候,会检查当前chunk的prev_inuse位是否为0,若为0,则表示物理地址相邻的前一个chunk是空闲状态,就会进入上面的if语句中,获取当前chunk的prev_size,计算总大小:(当前chunk的size加上当前chunk的prev_size),计算出来合并后的chunk首地址,然后进行unlink操作
在unlink的时候会检查chunk的格式:FD->bk != P || BK->fd != P
,我们需要提前伪造好这两个字段,才能成功的使chunk合并