zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    随机抽样一致性算法(RANSAC)
    RANSAC算法详解
    添加“返回顶部”小图标按钮的JS(JavaScript)代码详解
    vue-cli3组件嵌套
    vue-cli3文件的引入
    vue-cli3组件的使用
    vue ui 使用图形化界面
    vue-cli3及以上版本安装及创建项目
    NetTerm共享文件
    Gin框架配置静态文件static
  • 原文地址:https://www.cnblogs.com/luoleqi/p/12332909.html
Copyright © 2011-2022 走看看