堆漏洞挖掘:06---struct malloc

it2022-05-08  7

struct malloc_chunk { INTERNAL_SIZE_T mchunk_prev_size; INTERNAL_SIZE_T mchunk_size; struct malloc_chunk* fd; struct malloc_chunk* bk; struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */ struct malloc_chunk* bk_nextsize; };

一、成员介绍

每个成员都是8字节(64位系统中),4字节(32位系统中)

 mchunk_prev_size、mchunk_size

mchunk_prev_size:只有当该chunk的物理相邻的前一地址chunk是空闲的话,该字段在本chunk中才有用,用来记录前一个chunk 的大小 (包括chunk头)。否则,该字段为0是没有用的;但是当前一个chunk申请的大小大于前一个chunk的大小时,那么该字段可以用来给前一个chunk使用(这就是chunk的空间复用,后面文章介绍)mchunk_size:当前chunk的大小

fd、bk

当前chunk处于分配状态时:

fd:从fd字段开始的是用户的数据

当前chunk处于空闲时:

因为chunk处于空闲时,会被放到bin链中,所以fd和bk用于指向自己所在bin链中前后的空闲chunk

fd:指向前一个(非物理相邻)空闲的 chunk的指针(头指针)bk:指向后一个(非物理相邻)空闲的 chunk的指针通过fd和bk可以将空闲的chunk块加入到空闲的chunk块链表进行统一管理

fd_nextsize、bk_nextsize

也是只有chunk空闲的时候才使用,不过其用于较大的chunk(large chunk)

fd_nextsize:指向前一个与当前 chunk 大小不同的第一个空闲块,不包含bin的头指针bk_nextsize:指向后一个与当前 chunk 大小不同的第一个空闲块,不包含 bin 的头指针

一般空闲的 large chunk 在 fd 的遍历顺序中,按照由大到小的顺序排列。这样做可以避免在寻找合适 chunk 时挨个遍历

二、结构体大小的对齐原则

原则:struct malloc_chunk结构体的大小必须是2 * SIZE_SZ的整数倍。如果申请的内存大小不是2 * SIZE_SZ 的整数倍,会被转换满足大小的最小的2 * SIZE_SZ 的倍数(32位系统中,SIZE_SZ是4;64 位系统中,SIZE_SZ是8)当前chunk结构体的大小用mchunk_size成员的值表示

最新回复(0)