Sunichi's Blog

sunichi@DUBHE | Linux & Pwn & Fuzz

0%

ptmalloc malloc_consolidate分析

尝试做了下suCTF2018的noend,用到的泄漏的libc地址的方法之前未遇到过,顺带对malloc_consolidate的源代码进行了学习。

以下分析基于glibc-2.23进行。

free中,当达到某些条件的时候,会调用malloc_consolidate进行fastbin的chunk的合并。

首先,函数检查prev_chunk是否处于使用中,如果空闲,进行合并。

1
2
3
4
5
6
if (!prev_inuse(p)) {
prevsize = p->prev_size;
size += prevsize;
p = chunk_at_offset(p, -(long)prevsize);
unlink(av, p, bck, fwd);
}

如果下一个chunk不是top_chunk,进行如下操作:

  • 如果next_chunk空闲,合并next_chunk
  • 如果next_chunk使用中,将next_chunk的prev_inuse位置为0

接着将本chunk放入unsorted bin中:

1
2
3
first_unsorted = unsorted_bin->fd;
unsorted_bin->fd = p;
first_unsorted->bk = p;

如果本chunk不在small bin范围内,清空fd_nextsize和bk_nextsize。接着设置本chunk的属性:

1
2
3
4
set_head(p, size | PREV_INUSE);
p->bk = unsorted_bin;
p->fd = first_unsorted;
set_foot(p, size);

如果下一个chunk是top_chunk,进行合并:

1
2
3
size += nextsize;
set_head(p, size | PREV_INUSE);
av->top = p;

所以,当fastbin中有两个不同大小的chunk时,能使top chunk的bk和fd指向main_arena