heap | malloc consolidate

Author Avatar
Aryb1n 3月 15, 2019

起初完全不懂…
看了源代码, 笔记记在了0ctf2017-babyheap里
就大概是_int_malloc

  1. 请求的大小是large bin的时候, 常见
  2. 要用到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