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合并

添加新评论