有关realloc的堆攻击

通常来说堆是通过调用 glibc 函数 malloc 进行分配的,在某些情况下会使用 calloc 分配。calloc 与 malloc 的区别是 calloc 在分配后会自动进行清空,这对于某些信息泄露漏洞的利用来说是致命的。

calloc(0x20);
//等同于
ptr=malloc(0x20);
memset(ptr,0,0x20);

除此之外,还有一种分配是经由 realloc 进行的,realloc 函数可以身兼 malloc 和 free 两个函数的功能。

#include <stdio.h>

int main(void) 
{
  char *chunk,*chunk1;
  chunk=malloc(16);
  chunk1=realloc(chunk,32);
  return 0;
}

realloc 的操作并不是像字面意义上那么简单,其内部会根据不同的情况进行不同操作:

  • 当 realloc(ptr,size) 的 size 不等于 ptr 的 size 时

    • 如果申请 size > 原来 size
    • 如果 chunk 与 top chunk 相邻,直接扩展这个 chunk 到新 size 大小
    • 如果 chunk 与 top chunk 不相邻,相当于 free(ptr),malloc(new_size)
  • 如果申请 size < 原来 size

    • 如果相差不足以容得下一个最小 chunk(64 位下 32 个字节,32 位下 16 个字节),则保持不变
    • 如果相差可以容得下一个最小 chunk,则切割原 chunk 为两部分,free 掉后一部分
    • 当 realloc(ptr,size) 的 size 等于 0 时,相当于 free(ptr)
    • 当 realloc(ptr,size) 的 size 等于 ptr 的 size,不进行任何操作

最主要的就是要知道realloc具有free的功能