heap | malloc consolidate
起初完全不懂…
看了源代码, 笔记记在了0ctf2017-babyheap里
就大概是_int_malloc
里
- 请求的大小是large bin的时候, 常见
- 要用到top chunk, 但发现top chunk不够大了, (不太常见, 得多勤快
然后看到ctf-wiki对house_of_rabbit的讲解这个poc1
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/house_of_rabbit/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
unsigned long* chunk1=malloc(0x40); //0x602000
unsigned long* chunk2=malloc(0x40); //0x602050
malloc(0x10);
free(chunk1);
free(chunk2);
// chunk1[-1]=0xa1; //modify chunk1 size to be 0xa1
malloc(0x1000);
return 0;
}
这里chunk1[-1]=0xa1
赋值的这里, 如果有这一句, 那么malloc_consolidate
之后,fastbin不会被合并
gdb-peda$ heap freed
FASTBINS:
UNSORTBINS :
bins 8 :
0x602050 SIZE=0x50 DATA[0x602060] |................................| PREV_INUSE INUSED
bins 18 :
0x602000 SIZE=0xa0 DATA[0x602010] |................................| PREV_INUSE INUSED
达到的目的就是…0x602000
overlap掉了 0x602050
如果没有这一句,,,就会变成
gdb-peda$ heap freed
FASTBINS:
UNSORTBINS :
bins 18 :
0x602000 SIZE=0xa0 DATA[0x602010] |................................| PREV_INUSE INUSED
两块就变成一块了
所以这个…改掉某一fastbin free块的size…会对其他块在合并的时候造成问题…?
house of rabbit 就利用了在 malloc consolidate 的时候 fastbin 中的堆块进行合并时 size 没有进行检查从而伪造一个假的堆块
todo: 好好看看malloc_consolidate的代码
todo: hose_of_orange
todo: house_of_Roman