BruceFan's Blog

Stay hungry, stay foolish

0%

crackme2也是一道OWASP的Android题目,下面就用frida来解决它。
和crackme1一样,在模拟器中运行时会检测它是在root设备上运行的。
用JEB反编译之后,MainActivity如下:

阅读全文 »

简介

Manticore是一个用python开发的用来进行动态二进制分析的开源工具,可以帮助我们快速地利用符号执行、污点分析和插桩来分析二进制。
Manticore有一个命令行工具,可以用符号执行来产生程序的测试用例,当运行程序时,每个测试用例会产生不同的输出结果,例如一个普通的退出或一个崩溃。

阅读全文 »

加密算法分类

根据密钥数量

  • 对称加密:加解密使用相同密钥。基于复杂的非线性变换与迭代运算实现安全性。(DES、AES)
  • 非对称加密:加密使用公钥,解密使用私钥。基于某个数学难题实现安全性。(RSA)
阅读全文 »

最近在看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中的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设计理念强调组件化,组件之间的依赖性很小。我们发送一个intent请求可以做到:

  • 启动另一个应用的Activity
  • 启动某一个进程的Service
  • 可以注册一个广播,只要有这个事件发生你都可以收到
  • 可以查询一个Content Provider获得你想要的数据
阅读全文 »

Frida是一个动态代码插桩框架,这里的介绍主要以应用在Android平台应用程序上。动态二进制插桩(DBI)是将外部代码注入到现有的正在运行的二进制文件中,从而让它执行额外操作。DBI可以:

  • 访问进程内存
  • 在应用程序运行时覆盖函数
  • 从导入的类调用函数
  • 在堆上查找对象实例并使用
  • Hook、跟踪和拦截函数等

调试器也能完成相应工作,不过非常麻烦,比如各种反调试。

阅读全文 »

上一篇文章CVE-2014-7911 Android提权漏洞(一)中对CVE-2014-7911这个漏洞的原理和PoC进行了学习,通过学习这个漏洞感觉还是很有收获,因为之前只是做过CTF比赛中的题目,没太接触过实际的漏洞分析,所以通过这次学习不仅将之前学到的知识用到了实践,还对真实世界的漏洞有了初步了解。
这篇文章继续对这个漏洞的利用进行学习,最终目标是利用这个漏洞以system权限执行代码。
前情回顾,这个漏洞是利用Java反射和Binder进程间通信机制,向system_server传入一不可序列化的恶意对象,由于java.io.ObjectInputStream未对该输入的对象实例是否实际可序列化做校验,因此当该对象实例被ObjectInputStream反序列化时,将发生类型混淆,对象的Field被当作由native代码处理的指针,使攻击者获得控制权。

阅读全文 »