pwn工具箱之fastbin attack

fastbin attack

基本信息

  • 利用类型: 堆利用
  • 堆利用类型: 针对fastbin的利用
  • 利用思想: 利用fastbin的free只检查是否和上一个freechunk相等,使得同一个chunk两次进入free list,造成UAF,可以更改fastbin free chunk的fd信息,最终分配一个特定地址

利用难点

  1. 需要能够两次free同一个chunk
  2. 更改fd的时候,为了能够在之后的malloc之后返回这个值,需要通过一个check,会检查fd指向的这个位置的size(这个位置可以不用对齐),看是否属于正要malloc的这个bin的范围。

详细信息

fast bin的free检查了比较多的东西,所以这里就不再都贴出来了,其漏洞的主要原因在于fastbin
的实现其实是一个单链表实现的栈,后进先出,free的时候只检查了这个栈的栈顶,这样的话,
只要不是连续的free两次同一个chunk,就可以顺利的将一个chunk放进free list。之后的分配会使得
chunk虽然在free list里,但是也被分配了出来,这样就可以更改到fd指针,使其指向其他位置。

检查栈顶的代码如下:

    /* Check that the top of the bin is not the record we are going to add
       (i.e., double free).  */
    if (__builtin_expect (old == p, 0))
      {
        errstr = "double free or corruption (fasttop)";
        goto errout;
      }

需要注意的一点是,在分配的时候还有一个检查:

          if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
            {
              errstr = "malloc(): memory corruption (fast)";
            errout:
              malloc_printerr (check_action, errstr, chunk2mem (victim), av);
              return NULL;
            }
          check_remalloced_chunk (av, victim, nb);

这个检查是指即将分配的这个chunk大小应该在其相应大小的idx上,比如size都为0x20大小的
fastbin,能够接受的值就是0x20-0x27范围,分配过去应该有这个范围的值(被当做size),
否则将会出现memory corruption。

所以利用的时候需要想办法找到一个相应的size,这个size其实是不需要对齐的,所以可以通过
错位的方式构造一个假的size值出来。找到相应的size就可以进行分配到相应位置了。

你可能感兴趣的:(ctf,pwn)