arm构架uclibc
下的堆溢出初识
第五空间2020遇到的一道arm构架的题目。
1 | angela@angela-dev:/mnt/hgfs/share/pwn/5space/pwnme/lib$ file a.out |
可以看到是32位ARM动态链接的可执行文件,运行方式如下:
1 | qemu-arm -L ./lib ./a.out // ./lib为动态链接库的路径 |
首先介绍uclibc
,是 glibc
的一个精简版,主要用于嵌入式设备,比如路由器就基本使用的是 uClibc
, 简单自然效率高。所以他和一般的x86
的堆分配机制会有些不一样。
1 | struct heap_free_area |
所以 free
块在内存中的存储方式和 glibc
中的存储方式是不一样的。它的元数据在块的末尾,而 glibc
中元数据在 块的开头。
所以如果我们有一个堆溢出,我们就需要覆盖到下面空闲空间的 heap_free_area
中的 指针,才能实现 uClibc
中的 unlink
攻击
详细介绍uclibc的博客:https://www.cnblogs.com/hac425/p/9416738.html
而本题中由于edit函数存在堆溢出漏洞,于是我们可以首先构造overlop
泄露libc
之后利用堆溢出覆盖 heap_free_area
中的 指针为heaplist
造成unlink
最后利用edit函数覆盖free的got为system
1 | from pwn import * |