pwn heap 1

pwn heap 1

未命名绘图.drawio(7)

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)

image-20220316232545543

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)内的数据将成为废数据

image-20220316232156616

large bin free chunk

chunk的大小不固定

image-20220316232413125

fast bin free chunk

管理16、24、32、48、56、64byte的free chunk(32位,64位*2)

只有fast bin是单向链表

image-20220316233002416

image-20220317234218228

image-20220317234510382

逻辑链表

未命名绘图.drawio(6)

堆是先进后出的结构

当要使用bin中的chunk时候

image-20220318000109876

箭头指向的位置以下才是用户可以写入的区域,所以会返回箭头指向的地址

unsorted bin free chunk

未命名绘图(3).drawio(1)

posted @ 2022-03-22 20:09  MuRKuo  阅读(54)  评论(0编辑  收藏  举报