知识点
chunk结构
我们称由 malloc 申请的内存为 chunk,这块内存在 ptmalloc 中被称为 malloc_chunk 结构体表示
无论一个 chunk 的大小如何,处于分配状态还是释放状态,它们都使用一个统一的结构。虽然它们使用了同一个数据结构,但是根据是否被释放,它们的表现形式会有所不同
/*
This struct declaration is misleading (but accurate and necessary).
It declares a "view" into memory allowing access to necessary
fields at known offsets from a given base. See explanation below.
*/
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
prev_size:如果前一个 chunk 是空闲的话,记录物理相邻前一个 chunk 的大小;否则存储前一个的数据
size:该 chunk 的大小,必须是 2*SIZE_SZ 的整数倍,后三位分别是:
- NON_MAIN_ARENA(A):表示该 chunk 属于主分配区(1)或者非主分配区(0)
- IS_MAPPED(M):记录当前 chunk 是否是由 mmap 分配的,M 为 1 表示该 chunk 是从 mmap 映射区域分配的,否则是从 heap 区域分配的
- PREV_INUSE(P):记录前一个 chunk 块是否被分配。一般来说,堆中第一个被分配的内存块的 size 字段的 P 位都会被设置为 1,以便于防止访问前面的非法内存。当一个 chunk 的 size 的 P 位为 0 时,我们能通过 prev_size 字段来获取上一个 chunk 的大小以及地址。这也方便进行空闲 chunk 之间的合并。
fd、bk:chunk 处于分配时从 fd 字段开始就是用户数据了
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_chunk,同时struct_chunk的userdata的第二个(最后一个)指向了一个content_chunk.
注意struct_chunk的大小为8字节,content_chunk大小由content大小确定,所以我们不能让content为8字节,不然后面拿堆的时候会把content_chunk再拿到.
按顺序free掉struct_chunk0和struct_chunk1,然后申请内容为p32(magic)的node.
此时这个note2的struct_chunk是原来的struct_chunk1空间,content_chunk是原来的struct_chunk0空间.notelist[0]是新node
然后p32(magic)会存储在content_chunk的userdata前八位,也就是struct_chunk0的userdata的前八位.这个刚好是struct_chunk0的函数指针的部分.
此时调用printnote(0)会执行后门函数
标签:struct,chunk,content,fd,相关,空闲,size From: https://www.cnblogs.com/r0xy/p/18679488