pwn工具箱之house of force

house of force

基本信息

  • 利用类型:堆利用
  • 堆利用类型:top chunk相关
  • 利用思想:通过修改top chunk大小,使得分配任意大小都是从top chunk里边切出来,这样分配一个大小占满想要写的位置和当前分配位置top chunk的差,下一个分配就可以分配出想要写的位置

利用难点

  1. 需要有办法能够更改到top chunk大小
  2. 需要能够知道当前位置和要写位置的差值
  3. 需要能够自由控制将要分配的chunk的大小,也就是malloc的参数值
  4. 分配后,要能够修改分配出来的内容,这个技巧只负责分配出想要的位置。

详细信息

当相应的bins没有可分配的chunk的时候,malloc会从top chunk去切一部分作为分配的结果。如果top chunk不够大,将会调用sysmalloc向系统申请空间放入top chunk,然后再从top chunk进行分配:

      victim = av->top;
      size = chunksize (victim);

      if ((unsigned long) (size) >= (unsigned long) (nb + MINSIZE))
        {
          remainder_size = size - nb;
          remainder = chunk_at_offset (victim, nb);
          av->top = remainder;
          set_head (victim, nb | PREV_INUSE |
                    (av != &main_arena ? NON_MAIN_ARENA : 0));
          set_head (remainder, remainder_size | PREV_INUSE);

          check_malloced_chunk (av, victim, nb);
          void *p = chunk2mem (victim); //此处的victim已经是top chunk
          alloc_perturb (p, bytes); // 在top chunk里切一块
          return p;
        }

      /* When we are using atomic ops to free fast chunks we can get
         here for all block sizes.  */
      else if (have_fastchunks (av))
        {
          malloc_consolidate (av);
          /* restore original bin index */
          if (in_smallbin_range (nb))
            idx = smallbin_index (nb);
          else
            idx = largebin_index (nb);
        }

      /*
         Otherwise, relay to handle system-dependent cases
       */
      else // 如果不够
        {
          void *p = sysmalloc (nb, av); // 使用sysmalloc向系统进行分配
          if (p != NULL)
            alloc_perturb (p, bytes); // 切一块
          return p;
        }
    }

所以,只要使得top chunk的chunk size很大,就可以保证分配多大的数据都会从top chunk里去切一块,而不是使用sysmalloc向系统分配。这样的话,分配一个空间占完从需要修改的地方一直到现在分配的top chunk位置,下一次分配的时候再从top chunk去切,就可以直接分配出想要修改的地方进行修改了。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读