其他
某DEX_VMP安全分析与还原
本文为看雪论坛精华文章
看雪论坛作者ID:爱吃菠菜
一
思路整理
还原VMP需要哪些铺垫?
(1)定位VMP字节码
(2)分割VMP字节码
(3)还原成SMALI
(1)为什么要找VMP字节码的位置?
(2)为什么要分割VMP字节码?
(3)还原为SMALI
二
某安卓VMP入口特征(2021.8月样本)
三
定位VMP字节码
逻辑
F(index) == codeitem_addr。
(0x2dce->0xcac85880)。
如何在十几万数量级的汇编中定位到这段代码的?
展开上面的定位方式的两个前提条件:
我们已经有了关键数据0x2dce,但还需要知道另一个提前条件,
即codeitem是0xcac85880,所以这个信息是从哪得知的?
这里是本章的关键。
如何分析出codeitem的地址是0xcac85880?
(1) 已知明文
(2) 沙箱日志获取切入点
(3) JNI参数回溯
(4) 内存访问统计
(1)已知明文
NBSTraceEngine.startTracing();以及super.onCreate()
我们选一个被vmp保护了的onCreate()作为分析目标, ZxWebViewActivity.onCreate()
(2) 沙箱日志获取切入点
所以我们触发ZxWebViewActivity.onCreate()执行,截取其调用序列,效果如下:
(3) JNI参数startTracing来源回溯
然后作为起点向上展开回溯,希望找到其参数”startTracing”的最早出处,
如果有自动化的脚本和条件可进行污点分析,由于逻辑不是很复杂,这里人工回溯完成。
(4) 内存访问统计
因此我们检索一下,trace中对这片内存区域的访问情况。
所以0xcac85890-0x10取得codeitem地址0xcac85880,
即codeitem的地址是0xcac85880。
四
分割VMP字节码
依次......
通过观察codeitem的内存段的读取情况,可以达到这个目的。
如何快速区分出操作码和操作数?
opcode解密逻辑?
由eor指令向上回key出现的位置,
即可确定key的来源,
以及解密逻辑.
大致逻辑:
off1 = sub( codeitem当前指令地址, codeitem基址 )
off2 = lsl( off1, 1)
key = load( base + off2 )
de_opcode = xor(en_opcode, key)
五
VMP字节码还原为SMALI
1、标准dalvik指令反汇编过程
2、VMP指令反汇编过程
即必定存在invoke-static {v0}, method@00da6f // ...startTracing
3、还原VMP所有指令需要什么?
4、没有opcode对照表时如何展开还原?
(1)接口猜测法
Field相关的get set系列指令,也可以通过JNI执行情况猜测。
(2)参数推导法
(3)标准dalvik指令格式的信息利用
由于vmp指令是由dalvik标准指令略微修改/变异而来,只做了较小的改动,仍然保留了BIT位分布特征这样信息。在做还原时,可以利用这些信息,一定程度缩小候选范围。
https://source.android.com/devices/tech/dalvik/instruction-formats
https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions
六
攻击面总结
1、分析路径
2、攻击面总结 && 启示
(1) 被VMP的方法内部存在已知明文指令。
(2) VMP的实现高度依赖JNI函数,通过HOOK拿到其调用信息,是非常有效的切入点与突破口。
(3) codeitems的连续性,集中存储的特性,通过内存访问统计最终被发现。
(4)某vmp指令由标准dalvik指令基础上略改而来,整体仍然保留了很多可用信息。
七
深入VMP还原的一些问题
八
调试与工具总结
核心问题:
获取程序完整的执行&&数据信息 (trace)。
目前公开的主流的获取trace的方案:
① GDB调试
② FridaStalker编译执行
③ 脱机unicorn模拟执行
主流的获取trace的方案的弊端和缺陷:
速度极慢,且会遭遇反调试。
不支持arm指令的thumb模式,且BUG多,遭遇vmp.so中的花指令时,基本无法正常使用。
vmp.so中存在大量jni call和system call,需要手动实现它们,unicorn才能完成运行。
基于以上问题的尝试:
实现原始APP进程环境 && 原始context中,通过unicorn构造虚拟化CPU,执行目标function,获得trace,无已知检测和对抗手段,简单过anti。
基于trace进行离线分析:
文本 / json / 数据库 / EXCEL可视化表格 / 动态CFG图
地址含义解析 调用符号识别
看雪ID:爱吃菠菜
https://bbs.pediy.com/user-home-760871.htm
# 往期推荐
2.CVE-2019-9081 Laravel5.7 反序列化 RCE复现
球分享
球点赞
球在看
点击“阅读原文”,了解更多!