pwn heap 1
pwn heap 1
test.c
#include<stdio.h>
#include<stdlib.h>
int main(){
void* ptr = malloc(0x100);
free(ptr);
return 0;
}
chunk 最小的size
8字节(32位系统)
chunk分配的时候只可以分配整数倍字节的chunk(32位下是8的倍数)
导致了size
最后3bit
必定是0
malloced chunk
void* ptr = malloc(0x100)
A
代表是否是主线程
M
代表是否是MMAP的
P
(prev_bin_use)前一个chunk是否使用中,代表前一个chunk是否是一个free chunk,1
代表前一个chunk有写入信息,0
代表没有数据,若frr后,发现上一个chunk也是没有数据,那么会将两个chunk合并
当前一个chunk也是一个malloced chunk
时,只有size
被使用,prev_size
没有被使用
prev_size复用
malloc(0x20) == malloc(0x28)
覆盖掉prev的chunk的prev_sie
FREE后
free
只是标记上free而不是删除
chunk
被放入bin
中
bin
是链表形式的数组
small bin free chunk
每个chunk都一样
FD指针(forward缩写)
BK指针(backward缩写)
作用:将不同的free chunk链接成逻辑链表
当p被标记为0是后,合并chunk的操作,合并后p被标记为0的chunk的控制结构(prev_size,size,fd,bk)内的数据将成为废数据
large bin free chunk
chunk的大小不固定
fast bin free chunk
管理16、24、32、48、56、64byte的free chunk(32位,64位*2)
只有fast bin是单向链表
逻辑链表
堆是先进后出的结构
当要使用bin中的chunk时候
箭头指向的位置以下才是用户可以写入的区域,所以会返回箭头指向的地址
unsorted bin free chunk
A lion doesn't concern himself with the opinions of a sheep.