malloc_consolidate调用条件

很久没写博客了,现在有空更新一下吧

最近在做hitcon 2017的题,碰到一题是利用unsorted bin attack 攻击到stdin的struct上面的,但是利用方法怎么也想不到

于是看了下题解,发现利用了malloc_consolidate,于是去看下源码,找下这个函数被调用的条件,因为我们在一般的pwn里面只有malloc和free,所以我只讲一下在这两个函数里面触发的条件

1. malloc large bin

具体的代码如下,假如malloc的size大于small bin的范围,先调用malloc_consolidate将fastbin 合并为unsorted bin

2. top chunk不够空间

下面是简单的测试代码

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>

int main()
{
void* h1 = malloc(0x68);
void* h2 = malloc(0x20e48);
free(h1);
malloc(0x300);
return 0;
}

下面是源代码

3. 在free函数在各种合并前后chunk之后的size大于FASTBIN_CONSOLIDATION_THRESHOLD 也就是65536

比较容易实现的是与top chunk合并后size大于FASTBIN_CONSOLIDATION_THRESHOLD 具体大概是下面的流程

  1. 判断chunk是否属于fastbin,如果不是,继续
  2. 判断chunk是否属于map的,如果不是,继续
  3. 假如下一个chunk是top chunk,合并
  4. 判断当前chunk的size是否大于FASTBIN_CONSOLIDATION_THRESHOLD,假如大于,调用malloc_consolidate

测试代码如下

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>

int main()
{
void* h1 = malloc(0x68);
void* h2 = malloc(0xa8);
void* h3 = malloc(0xa8);
free(h1);
free(h3);
return 0;
}

这里是源码,上面的红框是合并top chunk,下面的是判断条件调用malloc_consolidate