一步一步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