前言
终于抽出时间对glibc动态内存管理部分源码进行初略的探究,试着从源码和动调来分析free函数执行过程和一些pwn的攻击技巧,分析的不是很全面,有错误的地方望提出指正,共同进步。ps:欢迎白帽子们关注 涂鸦智能安全响应中心
Mmap 处理
释放mmap空间内存
测试代码
断点于free
__libc_free()中Mmap_free处理代码
之后进入 mummap_chunk() 释放 mmap区域
malloc_consolidate函数
malloc_consolidate()算是一个特殊的free函数,作用是初识化main_arena->bin或者清空main_arena中的fastbins[]
源码文本搜索 malloc_consolidate (av) 一共在glibc-2.23/glibc/malloc/malloc.c >_int_malloc() 中出现了3次
申请smallbin size的堆块,并且当前bin未初始化
测试代码
关键判断逻辑 bin->bk 是否为0
之后进入 malloc_consolidate(),malloc_init_state()初始化 main_arena的bin
//执行流程
if (get_max_fast () != 0) {
.........
}
else {
malloc_init_state(av);
check_malloc_state(av);
}
执行结果
申请largebin size的堆块,并且main_arena中的fastbin不为空
测试代码
idx=0x40,have_fastchunks校验通过
进入malloc_consolidate()函数后,在fastbin初始化后get_max_fast()=0x80通过校验
clear_fastchunks的作用是将 main_arena 的结构体变量 flag置为1
atomic_exchange_acq()清空 main_arena中的fastbin[size]链表
malloc_consolidate函数之后的代码逻辑
执行效果,之前fastbin[0x20]中的堆块 0x602000被串入unsortedbin
在有fastbin的前提下,申请的chunk的size大于top_chunk,且申请size的大小属于smallbin
测试代码
调试到malloc_init_state()执行条件判断处,当前满足拥有fastchunks
进入malloc_consolidate()后清空了 fastbin
_int_free()中出现了1次
分析源码需要满足逻辑 在被释放的chunk的nextchunk是topchunk,且top_chunk size 大于等于 FASTBIN_CONSOLIDATION_THRESHOLD 情况下触发
测试代码
进入_int_free函数之后的关键逻辑 nextchunk = chunk_at_offset(free_chunk, size)是否为topchunk
之后合并free_chunk和topchunk
之后判断当前topchunk_size是否大于FASTBIN_CONSOLIDATION_THRESHOLD且存在fastbin之后执行 malloc_consolidate()
FASTBIN_CONSOLIDATION_THRESHOLD = 0xffff
具体函数内执行情况与情况2相同,遍历fastbin合并放入unsortedbins
执行结果
本文作者:Jambolt@涂鸦智能安全实验室
漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com) 欢迎白帽子来探索。
招聘内推计划:涵盖安全开发、安全测试、代码审计、安全合规等所有方面的岗位,简历投递sec@tuya.com,请注明来源。
发表评论
您还未登录,请先登录。
登录