简介
Manticore是一个用python开发的用来进行动态二进制分析的开源工具,可以帮助我们快速地利用符号执行、污点分析和插桩来分析二进制。
Manticore有一个命令行工具,可以用符号执行来产生程序的测试用例,当运行程序时,每个测试用例会产生不同的输出结果,例如一个普通的退出或一个崩溃。
最近在看Linux Kernel Exploit相关的东西,要用到一些栈和地址相关的知识,所以就看一点补充一点吧。这篇文章介绍一下关于物理地址和虚拟地址的相关知识。
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址(Physical Address,PA)
。CPU访问存储器的最自然的方式就是使用物理地址。这种方式称为物理寻址(physical addressing)
。
早期的PC使用物理寻址,现代处理器使用的是一种称为虚拟寻址(virtual addressing)
的寻址方式。CPU通过生成一个虚拟地址(Virtual Address,VA)
来访问主存,这个虚拟地址在被送到存储器之前转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译(address translation)
。CPU上叫做存储器管理单元(Memory Management Unit,MMU)
的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理的。
Binder是Android系统提供的一种进程间通信(IPC)机制。由于Android是基于Linux内核的,因此,还存在其他的IPC机制,Linux已经拥有的进程间通信IPC手段包括:管道(Pipe)
、信号(Signal)和跟踪(Trace)
、Socket
、报文队列(Message)
、共享内存(Shared Memory)
和信号量(Semaphore)
。采用Binder机制主要有两点,性能和安全。在移动设备上,广泛地使用跨进程通信肯定对通信机制本身提出了严格的要求;Binder相对出传统的Socket方式,更加高效;另外,传统的进程通信方式对于通信双方的身份并没有做出严格的验证,只有在上层协议上进行架设;比如Socket通信ip地址是客户端手动填入的,都可以进行伪造;而Binder机制从协议本身就支持对通信双方做身份校检,因而大大提升了安全性。这个也是Android权限模型的基础。
Android设计理念强调组件化,组件之间的依赖性很小。我们发送一个intent请求可以做到:
了解了Frida基本使用方法之后,下面对Frida进行一些实践。
首先下载crackme1,安装到模拟器上并运行:
Frida是一个动态代码插桩框架,这里的介绍主要以应用在Android平台应用程序上。动态二进制插桩(DBI)是将外部代码注入到现有的正在运行的二进制文件中,从而让它执行额外操作。DBI可以:
调试器也能完成相应工作,不过非常麻烦,比如各种反调试。
上一篇文章CVE-2014-7911 Android提权漏洞(一)中对CVE-2014-7911这个漏洞的原理和PoC进行了学习,通过学习这个漏洞感觉还是很有收获,因为之前只是做过CTF比赛中的题目,没太接触过实际的漏洞分析,所以通过这次学习不仅将之前学到的知识用到了实践,还对真实世界的漏洞有了初步了解。
这篇文章继续对这个漏洞的利用进行学习,最终目标是利用这个漏洞以system权限执行代码。
前情回顾,这个漏洞是利用Java反射和Binder进程间通信机制,向system_server
传入一不可序列化的恶意对象,由于java.io.ObjectInputStream
未对该输入的对象实例是否实际可序列化做校验,因此当该对象实例被ObjectInputStream反序列化时,将发生类型混淆,对象的Field被当作由native代码处理的指针,使攻击者获得控制权。