black hat heap exploitation 笔记

heap and arena data structures

_heap_info

typedef struct _heap_info { 
    mstate  ar_ptr; /* Arena for this heap. */ 
    struct _heap_info *   prev;   /*  Previous  heap.  */  
    size_t    size;     /* Current size in bytes. */ 
    char     pad[-5 * SIZE_SZ & MALLOC_ALIGN_MASK]; } heap_info;
  • mstate ar_ptr:指向分配区的指针
  • struct _heap_info *ptr:指向上一个 heap_info 结构
  • size_t size:分配堆大小
  • char pad[...]:用于填充对齐

malloc_state

struct malloc_state { 
    mutex_t  mutex;  /* Serialize access.  */ 
    int  flags;  /* Flags (formerly in max_fast).  */ 
#if THREAD_STATS 
/* Statistics for locking.  Only used if THREAD_STATS is defined. */
    long     stat_lock_direct, stat_lock_loop, stat_lock_wait; #endif 
    mfastbinptr       fastbins[NFASTBINS]; /* Fastbins */ 
    mchunkptr         top; 、
    mchunkptr         last_remainder; 
    mchunkptr         bins[NBINS * 2]; 
    unsigned int      binmap[BINMAPSIZE];  /* Bitmap of bins */ 
    struct malloc_state *next;    /* Linked list */ 
    INTERNAL_SIZE_T  system_mem; 
    INTERNAL_SIZE_T  max_system_mem; 
};
  • mutex_t mutex:用于对 ptmalloc 实现所采用的各种数据结构的同步访问
  • int flags:标志位,用于表示分配区的各种特征
  • long stat_lock_direct、stat_lock_loop、stat_lock_wait:用于提供各种锁定统计信息
  • mfastbinptr fastbins[...]: fastbin 数组
  • mchunkptr top:顶部块
  • mchunkptr last_remainder:当对存储块的少量请求完全不适合任何给定的存储块时使用
  • mchunkptr bins[...]: bins 数组
  • unsigned int binmap[...]:用作单级索引,有助于加速遍历
  • struct malloc_state *next:指向下一个malloc_state
  • INTERNAL_SIZE_T system_mem、max_system_mem:用于跟踪当前系统分配的内存量

Chunks of memory

malloc_chunk

struct malloc_chunk {             
INTERNAL_SIZE_T    prev_size;                        
INTERNAL_SIZE_T    size;                        
struct    malloc_chunk*    fd;                        
struct    malloc_chunk*    bk;            
}
  • INTERNAL_SIZE_T prev_size:当前块前一块的大小,仅在前一块空闲时使用
  • INTERNAL_SIZE_T size:当前块大小,用于遍历分配的块
  • struct malloc_chunk *fd:指向循环双向链接的空闲列表中的下一块(如果该块当前空闲)的指针
  • struct malloc_chunk *bk:指向循环双向链接的空闲列表中的上一块(如果该块当前空闲)的指针

1.分配的块通过指针算数遍历(借助 size )
2.空闲块通过循环链接列表遍历(借助 malloc_chunk *fd 和 malloc_chunk *bk )

Binning

  内存被 free 之后存储在称为 bin 的链接链表中,它们按照大小排序,以允许的最快速度进行检索。也就是说,释放内存后,它实际并没有返回操作系统,而是可能进行了碎片整理和合并,并存储在 bin 中的链接列表中,以便以后进行分配。
  Bin 分为 fastbin 和 normal bin

  • fastbin:不与其他空闲块合并,没有排序,仅通过单向链接列表链接,采用 LIFO 方式
  • normal bin:
    • unsorted bin
    • small bin
    • large bin:从大到小排序,按 FIFO 的顺序分配
  • Top chunk:用作分配请求提供内存的最后手段
  • last_remainder
原文地址:https://www.cnblogs.com/luoleqi/p/12332909.html