Android背景介绍
Android与JAVA的关系
- JAVA基于堆栈、Dalvik基于寄存器
- 二进制代码比虚拟机执行更快
- ART使用了AOT,提前将应用编译为二进制代码。
用C++也可以写Android且更好。
必须要用开发者的密钥进行签名
- Jarsigner
- 用户可自行生成密钥库
漏洞类型:
- 应用漏洞 vs 系统漏洞
- Java漏洞 vs Native漏洞
- 内核漏洞、HAL漏洞、Service Lib漏洞、Framework漏洞、应用层漏洞
思考方向:
- 攻击面
- 用户输入->应用->Framework->Service/Lib->HAL->内核
漏洞挖掘方法:
- Fuzz
- 人眼看
- 符号执行
Android漏洞利用
调试
- IDA Pro
- GDB
- ……
Hook
- Xposed
- Frida
- ……
应用层漏洞
保护机制:Canary、ASLR、DEP
- HeadSpray
- 信息泄露漏洞
- ROP
逻辑代码保护与逆向技术对抗:
- 编译与反编译
- 加壳与脱壳
- 原生代码混淆与解混淆
- 隐藏于取证
Java层:
- Java->jvm字节码->dalvik字节码(javac,dx) – DEX文件->smali(baksmali)
- DEX文件->smali,伪java(jeb等)
- DEX文件->Java字节码(dex2jar等)
-
Java字节码->伪java(jd-gui,enigma等) Native层:
- C/C++ -> ELF(gcc g++)
- ELF->ARM汇编(IDA,objdump/readelf等) – 反编译为伪C/C++代码(IDA等)
针对特定加固方案的特殊对抗方案
- 钩子技术(Hook)
- 基于Xposed的ZJDroid等
- Dump内存重建DEX
- 需要较多手动分析
基于修改Android 运行时的通用加固对抗方案
- Android系统本身并不支持加固
- Android运行时(Runtime)收到的是正确的逻辑
- DexHunter/AppSpear,可对抗已知所有加固平台
DexHunter
– 类第一次加载时,遍历所有DEX类,加载并初始化; – 通过内存中数据结构定位需要获取的程序逻辑; – 获取程序逻辑并保存; – 改正并重建整个DEX文件;
Appspear
– 监控JNI调用等加固关键指令,正确程序已释放之后 – 查找DEX文件的DDS逆向重建DEX文件 – 收集并打包其他信息
原生代码混淆
- C/C++源码 -> 混淆后的ELF 混淆工具
- LLVM-Obfuscator(strong.codes)
- CXX-Obfuscator等 混淆技术
- 指令替换
- 伪造控制流
- 扁平化控制流 – 字符串混淆
题目解析
- 简单逆向类(LoopAndLoop,Timer等)
- 直接用反编译工具看懂逻辑即可
- 有时候需要重打包一下
- 加壳(Jumble等)
- 直接逆吧。。把逻辑看懂
- 混淆(Steady等) – 硬逆
- 由于flag取值空间小,可被直接爆破 隐藏、取证(未出现)
转载请注明:碎雪的小屋 » 0x06-Mobile