Largebin attack

largebin attack|概述

前言:用的glibc版本是2.33

●Largebin时glibc中, 超过0x400大小的空闲内存所构成的链表 ●Largebin的特质和unsortbin类似, 只是多了一个bk_next_size和fd_ next_ size的指针,用于指向比当前堆块大小大的指针或小的指针,largebin存储的堆块不是固定大小,而是存储范围,这个指针用于加快largebin的寻找

largebin attack|largebin attack原理

在glibc的malloc.c中,有一个函数_int_malloc,其中有一个片段如下

if (in_smallbin_range (size))
          {
             victim_index = smallbin_index (size);
             bck = bin_at (av, victim_index);
             fwd = bck->fd;
          }
         else
          {
             victim_index = largebin_index (size);
             bck = bin_at (av, victim_index);
             fwd = bck->fd;

             /* maintain large bins in sorted order */
             if (fwd != bck)
              {
                 /* Or with inuse bit to speed comparisons */
                 size |= PREV_INUSE;
                 /* if smaller than smallest, bypass loop below */
                 assert (chunk_main_arena (bck->bk));
                 if ((unsigned long) (size)
     < (unsigned long) chunksize_nomask (bck->bk))
                  {
                     fwd = bck;
                     bck = bck->bk;

                     victim->fd_nextsize = fwd->fd;
                     victim->bk_nextsize = fwd->fd->bk_nextsize;
                     fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
                  }
                 else
                  {
                     assert (chunk_main_arena (fwd));
                     while ((unsigned long) size < chunksize_nomask (fwd))
                      {
                         fwd = fwd->fd_nextsize;
 assert (chunk_main_arena (fwd));
                      }

                     if ((unsigned long) size
 == (unsigned long) chunksize_nomask (fwd))
                       /* Always insert in the second position. */
                       fwd = fwd->fd;
                     else
                      {
                         victim->fd_nextsize = fwd;
                         victim->bk_nextsize = fwd->bk_nextsize;
                         if (__glibc_unlikely (fwd->bk_nextsize->fd_nextsize != fwd))
                           malloc_printerr ("malloc(): largebin double linked list corrupted (nextsize)");
                         fwd->bk_nextsize = victim;
                         victim->bk_nextsize->fd_nextsize = victim;
                      }
                     bck = fwd->bk;
                     if (bck->fd != fwd)
                       malloc_printerr ("malloc(): largebin double linked list corrupted (bk)");
                  }
              }
             else
               victim->fd_nextsize = victim->bk_nextsize = victim;
          }

         mark_bin (av, victim_index);
         victim->bk = bck;
         victim->fd = fwd;
         fwd->bk = victim;
         bck->fd = victim;

其中

victim->bk_nextsize->fd_nextsize = victim;

伪造修改堆地址

还有一处

victim->bk = bck;
         victim->fd = fwd;
         fwd->bk = victim;
         bck->fd = victim;

伪造bck指针写入地址,(但是目前最高版本增加了检查不行了)

largebin attack|House of storm(2.27及之前的版本)

House of strom具体是利用largebin attack和unsortbin的一种攻击方法, 具体有三个步骤

1、准备,首先我们分配两块largebin和一块unsortbin

2、利用largebin attack攻击指定内存,实际上是为了为找一个chunk,修改的bk指针,是为了让unsortbin解链时需要,否则会直接报错,然后size我们可以用错位写,写就是设置bk_ next_ size. 为(long)&attack-5,这样就可以只写一个字节到size位,再利malloc- -块大内存,从而largebin attack

3,最后改写unsortbin的bk指针,然后malloc(0x48),因为堆地址时随机化的,所以这个只有1/3的成功率,最后我们成功将栈内存申请出来了

附:这个攻击对堆块size有一定要求,也就是伪造堆块size高位没有其他数据就好了,在2.27之后,unsortbin增加了对链表完整性的检查使其失效

posted @ 2022-03-07 21:55  vi0let  阅读(61)  评论(0编辑  收藏  举报