Skip to main content

深入学习堆结构

ElegyAbout 2 minpwnheap

深入学习堆结构

做hgame的时候 有点做不动heap的题 所以来学习一下基本功
学习文章:【pwn】学pwn日记(堆结构学习)(随缘更新)_pwn 堆特性-CSDN博客open in new window

堆管理器

  • 在linux中 堆管理器 由libc.so.6链接库实现

    • brk
    • mmap
  • brk函数

    • 申请小的内存空间 从heap下方的data段 向上申请内存
  • mmap函数

    • 一般申请较大的内存空间 从shared libraries里面开新的空间

    • 子线程只能用mmap函数

流程

  • 用户使用malloc函数向堆管理器申请一块内存空间
  • 堆管理器用brk或者mmap函数去获取内存

chunk结构

  • 完整的chunk 一般是prev_size ,size(含AMP),fd, bk, fd,_nextsize,bk,_nextsize这几个组成

    需要注意的是 prev_size有且仅当 上一个chunk处于free状态的时候来表示 上一个chunk的大小否则 就作为上一个chunk的一部分来存数据

    chunk_struct
    chunk_struct
  • alloced chunk 由于是使用状态所以 在使用的就只有prev_size 和size两个部分

    alloced_chunk
    alloced_chunk
  • free chunk常见的就是携带fd 和bk 然后当p为0的时候 两个chunk会合并为一个较大的chunk

  • fast bin的chunk

    • 保留最基本结构 最简单的结构 也就是 prev_size+size+fd+data 所以 fastbin最小结构为0x20 也就是4* 0x8(64位)
  • top chunk 也就是一个超大的chunk 用户申请内存的时候 会先搜索bins 然后再搜索top chunk实在不够才会去调用brk函数申请空间 然后再从top chunk中申请

申请内存的过程

这里原文章讲特别好 我直接copy了(虽然之前也是copy)

  1. 申请内存<64bytes 则从tcachebin(tcachebin 从glibc2.26引入),fast bins或者smallbin
  2. 申请内存 >64bytes 则从unsorted bin
  3. unsorted bin无和是bin则遍历unsorted bin合并free chunk 然后找 如果有合适的就直接给 否则将合并后的放入对应bin
  4. large bin
  5. top chunk中找
  6. brk函数申请 然后从top chunk中找
  7. mmap函数 申请 然后从top chunk中找
  • 当我们申请0xn00xn8内存大小的时候 系统其实给我们的是一样的chunk大小 因为我们可以利用下一面一个chunk的prev_size的空间 刚好0x8的空间(64位)