某菜狗的pwn学习笔录(一)

pwn的堆学习笔记(一)
看堆有段时间了,但是自己感觉还是不是很理解的,所以还是要多写笔记啊//外加督促自己不会半路咕咕咕23333
0x0 堆是什么
堆可以提供动态内存的分配,是程序虚拟地址空间的一块连续的线性区域,由低地址向高地址生长。
堆在被释放后,一般不是直接返回操作系统,而是由堆管理器进行管理。而那些被释放的内存则可以用来响应新的请求
malloc函数用来进行申请内存空间,其中malloc(size_t n)中,n=0时候,返回当前系统允许的堆的最小内存块。而n是负数时候,因为在大部分系统上size_t是无符号数,由于整数溢出,程序将申请很大的内存空间,但一般这样以失败告终。
而free(void* p)则会释放p指向的内存块。
注意点:p是空指针时候,函数不执行操作。
p在已经被释放过一次后再次被释放会出现double free漏洞
堆的起始地址sbrk以及堆的末尾brk,在初始时候指向同一地址。
但根据ASLR是否开启,分以下俩种情况:

1,不开启时候,sbrk以及brk会指向data/bss段的结尾。
2,开启时候,在初始时候也会指向同一地址,但这个地址是在data/bss段结尾后的随机偏移处. 0x1 堆的一些相关的数据结构

1,chunk
在程序执行的时候,我们成malloc申请的内存为chunk,这段内存用malloc_chunk结构体来表示。当chunk被free掉后,会被加入到相应的空闲管理列表中。
不过,chunk却有一个特征,任何一个chunk,不管大小,处于分配状态还是释放状态,都是使用的是一个统一的结构。
结构如下:

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被使用,则它可以作为前一个chunk的一部分来被使用
size,记录该chunk大小,大小一定是2*size_sz的倍数,切该字段的低三位与大小无关
fd,bk,若chunk被分配,则从fd开始存储数据(content)
否则,fd存世下一个空闲chunk地址,bk存储上一个空闲chunk
空闲时,fd_nextsize 指向前一个与当前 chunk 大小不同的第一个空闲块,不包含 bin 的头指针。
bk_nextsize 指向后一个与当前 chunk 大小不同的第一个空闲块,不包含 bin 的头指针。
至于使用时候的chunk模样跟被释放后的可以参考ctf-wiki上的:
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/heap_structure/
2,bin
ptmalloc根据空间的chunk大小及状态分为四类:fast bin,small bin,large bin,unsorted bin
ptmalloc 为了提高分配的速度,会把一些小的 chunk 先放到 fast bins 的容器内。而且,fastbin 容器中的 chunk 的使用标记总是被置位的,所以不满足上面的原则。
fast bin中还有一个特性是最近释放的chunk更早被分配,有点类似于栈的先进后出原则。
在fastbin中的chunk不会跟其他被释放的chunk合并
top chunk
程序第一次进行 malloc 的时候,heap 会被分为两块,一块给用户,剩下的那块就是 top chunk。
这个 chunk 不属于任何一个 bin,它的作用在于当所有的 bin 都无法满足用户请求的大小时,如果其大小不小于指定的大小,就进行分配,并将剩下的部分32位下malloc的最小分配单位为16字节,64位下最小分配单位为32字节。作为新的 top chunk。否则,就对 heap 进行扩展后再进行分配。
就先总结到这儿吧。

你可能感兴趣的:(pwn)