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