pwn工具箱之house of force

来源:互联网 发布:思科网络会议系统 编辑:程序博客网 时间:2024/05/16 04:42

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去切,就可以直接分配出想要修改的地方进行修改了。

原创粉丝点击