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