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 最小的size8字节(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.

浙公网安备 33010602011771号