fastbin dup 来获取libc地址
fastbin dup 来获取libc地址
当我在做0ctf2017 babyheap的时候遇到利用fastbin dup 来泄露mainarena的地址来获取libc的地址,其他大佬给的wp没有讲如果通过泄露的smallbin的地址获取mainarena和获取libc的地址。
获取mainarena地址
首先我们要知道
- bin是由struct chunk结构体组成的链表。
- 不同的chunk更据特点的不同分为不同的chunk,为了将这些chunk进行分类管理,glibc采用了bin链这种方式管理不同的chunk。
- 不同的bin链是由arena管理的
- bin链中的chunk均为free chunk。
- 主线程的main_arena保存在libc.so的数据段里面,其他线程的arena则保存在该arena分配的heap里面。
bin链的保存依赖struct malloc_state结构体
1 | typedef struct malloc_chunk* mchunkptr; |
但是不同版本也有不同的malloc_state结构体,于是需要具体问题具体分析。
于是更据malloc_state结构体我们可以知道mainarena的地址。
获取libc地址
获取libc的地址,我们需要先获取mainarena在libc中的偏移,于是我们需要去源代码中找那些函数用了mainarena,再去libc中寻找对应mainarena中找即可,于是我们找到了__malloc_trim函数调用了main_arena,并且函数流程比较少,就算libc去除了符号,我们也能根据有符号表的libc来找到mainarena的地址。
为什么我说一定能在libc中找到main_arena呢,因为main_arena是静态的,本身就是存储在libc的数据区的。
1 | static struct malloc_state main_arena; |
下面是__malloc_trim的函数定义:
1 | int __malloc_trim (size_t s) |
当然__malloc_trim函数不是唯一的函数,也可以用其他包含main_arena的函数,比如malloc_info更加简单易读。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Daily Study!