尝试做了下suCTF2018的noend,用到的泄漏的libc地址的方法之前未遇到过,顺带对malloc_consolidate
的源代码进行了学习。
以下分析基于glibc-2.23进行。
在free
中,当达到某些条件的时候,会调用malloc_consolidate
进行fastbin的chunk的合并。
首先,函数检查prev_chunk是否处于使用中,如果空闲,进行合并。
1 | if (!prev_inuse(p)) { |
如果下一个chunk不是top_chunk
,进行如下操作:
- 如果next_chunk空闲,合并next_chunk
- 如果next_chunk使用中,将next_chunk的prev_inuse位置为0
接着将本chunk放入unsorted bin中:
1 | first_unsorted = unsorted_bin->fd; |
如果本chunk不在small bin范围内,清空fd_nextsize和bk_nextsize。接着设置本chunk的属性:
1 | set_head(p, size | PREV_INUSE); |
如果下一个chunk是top_chunk
,进行合并:
1 | size += nextsize; |
所以,当fastbin中有两个不同大小的chunk时,能使top chunk的bk和fd指向main_arena
。