堆漏洞挖掘中的Chunk分类(allocated chunk、free chunk、top chunk、last remainder chunk)_内存分配

  • 此图是在上篇文章介绍arena时用到的,我们可以看到:堆块被分为不同的种类,下面我们将来介绍这些。
  • 每一类就是一个malloc_chunk结构体,因为这些chunk同属于一个堆块,所以在一块连续的内存中,只是通过区域中特定位置的某些标识符加以区分。
  • glibc给我们申请的堆块主要分为以下几类:
    • allocated chunk。
    • free chunk。
    • top chunk。
    • Last remainder chunk。
  • 为了简便,我们将4个种类的chunk划分为2个种类的chunk,这两个种类的chunk才是我们平常口头上所使用到的:
    • allocated chunk:当前chunk是被应用层用户所使用的。
    • free chunk:当前chunk是空闲的,没有被应用层用户所使用。

Top Chunk:

  • 概念:当一个chunk处于一个arena的最顶部(即最高内存地址处)的时候,就称之为top chunk。
  • 作用:该chunk并不属于任何bin,而是在系统当前的所有free chunk(无论那种bin)都无法满足用户请求的内存大小的时候,将此chunk当做一个应急消防员,分配给用户使用。
  • 分配的规则:如果top chunk的大小比用户请求的大小要大的话,就将该top chunk分作两部分:1)用户请求的chunk;2)剩余的部分成为新的top chunk。否则,就需要扩展heap或分配新的heap了——在main arena中通过sbrk扩展heap,而在thread arena中通过mmap分配新的heap。

Last Remainder Chunk:

  • 它是怎么产生的:当用户请求的是一个small chunk,且该请求无法被small bin、unsorted bin满足的时候,就通过binmaps遍历bin查找最合适的chunk,如果该chunk有剩余部分的话,就将该剩余部分变成一个新的chunk加入到unsorted bin中,另外,再将该新的chunk变成新的last remainder chunk。
  • 它的作用是什么:此类型的chunk用于提高连续malloc(small chunk)的效率,主要是提高内存分配的局部性。那么具体是怎么提高局部性的呢?举例说明。当用户请求一个small chunk,且该请求无法被small bin满足,那么就转而交由unsorted bin处理。同时,假设当前unsorted bin中只有一个chunk的话——就是last remainder chunk,那么就将该chunk分成两部分:前者分配给用户,剩下的部分放到unsorted bin中,并成为新的last remainder chunk。这样就保证了连续malloc(small chunk)中,各个small chunk在内存分布中是相邻的,即提高了内存分配的局部性。
  • 详情见文章:javascript:void(0)

  • 我是小董,V公众点击"笔记白嫖"解锁更多【堆漏洞挖掘】资料内容。

堆漏洞挖掘中的Chunk分类(allocated chunk、free chunk、top chunk、last remainder chunk)_标识符_02