一步一步pwn路由器之uClibc中malloc&&free分析
前言
本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274
栈溢出告一段落。本文介绍下 uClibc 中的 malloc 和 free 实现。为堆溢出的利用准备基础。uClibc 是 glibc 的一个精简版,主要用于嵌入式设备,比如路由器就基本使用的是 uClibc, 简单自然效率高。所以他和一般的x86的堆分配机制会有些不一样。
正文
uClibc 的 malloc 有三种实现,分别为:

其中 malloc-standard 是最近更新的。它就是把 glibc 的 dlmalloc 移植到了 uClibc中。malloc 是uClibc最开始版本用的 malloc。本文分析的也是malloc目录下的uClibc自己最初实现的 malloc。 因为如果是 malloc-standard 我们可以直接按照 一般 linux 中的堆漏洞相关的利用技巧来利用它。
现在编译 uClibc 的话默认使用的是 malloc-standard ,我也不知道该怎么切换,所以就纯静态看看 malloc目录下的实现了。
malloc
从 malloc 的入口开始分析。 为了简单起见删掉了无关代码。
malloc 实际使用的是 malloc_from_heap 来分配内存。
|
|
计算需要分配内存块的真实大小后进入 __heap_alloc 分配。
在 heap中使用 heap_free_area 来管理空闲内存,它定义在 heap.h
所以 free 块在内存中的存储方式和 glibc 中的存储方式是不一样的。它的元数据在块的末尾,而 glibc中元数据在 块的开头。
下面继续分析 __heap_alloc
|
|
找到大小 >= 请求size 的 heap_free_area,然后进入 __heap_free_area_alloc 分配。
|
|
注释很清晰了。所以如果我们有一个堆溢出,我们就需要覆盖到下面空闲空间的 heap_free_area 中的 指针,才能实现 uClibc 中的 unlink 攻击(当然还要其他条件的配合),另外我们也知道了在 malloc 的时候,找到合适的 heap_free_area 后,只需要修改 heap_free_area 的 size位就可以实现了分配,所以在 malloc 中是无法 触发类似 unlink 的攻击的。
下面进入 free
Free
首先看 free 函数。
|
|
直接调用了 free_to_heap 函数。
|
|
首先获得了 内存块的起始地址和大小,然后调用 __heap_free 把要 free 的内存放到 heap 中。
|
|
__heap_link_free_area 就是简单的链表操作。没有什么用。
感觉唯一可能的利用点在于,前后相邻的情况,需要先把 prev_fa 拆链表,我们如果可以伪造 prev_fa->prev,就可以得到一次内存写的机会,不过也只能写入 fa 的值
|
|
总结
怎么感觉没有可利用的点,还是太菜了。以后如果遇到实例一定要补充进来。
tips:
分析库源码时看不太懂可以先编译出来,然后配合这
ida看,所以要编译成x86或者arm方便f5对照看。比如这次,我把uClibc编译成arm版后,使用ida一看,发现uClibc怎么使用的是glibc的那一套,一看源码目录发现,原来它已经切换到glibc这了。忽然想起来交叉编译环境感觉可以用 docker 部署,网上一搜发现一大把,瞬间爆炸。
参考链接:
http://blog.chinaunix.net/uid-20543183-id-1930765.html
http://hily.me/blog/2007/06/uclibc-malloc-free/
本站文章均原创, 转载注明来源
本文链接:http://blog.hac425.top/2017/10/28/step_by_step_pwn_router_part6.html