ollvm9
Android逆向解题-ollvm9
资源
[原创]浅尝ollvm轻度混淆后的加密算法分析-Android安全-看雪-安全社区|安全招聘|kanxue.com
简介
包名:”com.kanxue.ollvm_ndk_9”
行为
一个Check按钮,点击后,中间的Text框输出随机的字符串。
Java层静态分析
1 | public void onClick(View view) { |
生成一个包含36个字符的随机字符串,其中字符由字母和数字组成。
然后进入一个叫做UUIDCheckSum
的自定义Native函数,得到UUIDCheckSum
字符串,最后用setText
打印到Text框上。
所以核心点就在于这个Native函数UUIDCheckSum
。
1 | public static native String UUIDCheckSum(String str); |
Native层静态分析
arm64架构的libnative-lib.so
。
直接看Export,看到里导出函数:
1 | jstring __fastcall Java_com_kanxue_ollvm_1ndk_MainActivity_UUIDCheckSum(JNIEnv *env, jclass clazz, jstring str) |
稍微肉眼看了一下,恢复了部分逻辑,但是下面有平坦化的地方还是很混乱。:
1 | jstring __fastcall Java_com_kanxue_ollvm_1ndk_MainActivity_UUIDCheckSum(JNIEnv *env, jclass clazz, jstring str) |
其中的符号aUuidchecksum指向了一块字符串,但是会在.init_array
时首先被解密。因此后面先用动态Frida Hook的方法把解密后的数据给拿到。
看Log
因为Java层里面有:
1 | Log.e("kanxue", "input: " + randomAlphanumeric + " output: " + UUIDCheckSum); |
所以直接用Logcat看:
1 | 2023-06-04 15:06:48.347 8563-8563/? E/kanxue: input: Lc8m3svDL7v5IvOmgO8pbWTqEyNKP5wnPbcT output: hk8Tp39MrOiHbBqOg2OOp6nc_l5xjzj4_lvdgz4OrAXfmN8T |
Frida分析
dump datadiv数据
.init
段内有自动解密数据的函数。这里我用Frida把它执行后的结果直接dump出来了。
hook_ollvm9.js
1 | //8.0以下所有的so加载都通过dlopen |
执行后得到结果:
1 | 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF |
找到三个有代表性的结构,偏移+10的,+60的,+80的。
Hook sub_FCB4
,sub_F9B8
代码写的比较丑,不过问题不大。sub_F9B8
(即do_sth3
)似乎没Hook到具体干了啥,进入函数和离开函数时,打印的值都是一致的。
1 | var tmp; |
打印结果:
1 | enter do_sth1: |
Hook NewStringUTF
1 | v15 = (*env)->NewStringUTF(env, v11); |
这里生成的v15
就是整个Native函数的返回值了。而这个传入的v11
显然就是C语言字符串,而且根据传参调用约定,应该是寄存器X1。
因此直接Hook地址,打印X1即可。
1 | var final = base.add(0x100DC) |
得到结果:
1 | iPruazuKn3uHilzNc2OOiR0K_h9Vayze_iDEhkz8qj5aph0N |
部分总结
sub_FCB4
的值是36字节输入,36字节输出,进行了一些自定义修改。
而虽然sub_F9B8
的直接输出暂时没看到,但是36字节的输入,到最后整个Native函数的返回值,就类似于一个base64魔改。
1 | 0123456789-_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ |
解sub_F9B8
(Base64魔改)
1 | import base64 |
分析sub_FCB4
算法(!TODO)
这一次的核心任务不是嗯看算法,所以暂时这里pass。不过提供一个别人逆向过的代码:
1 |
|
Unicorn(没分析)
unicornDemo/main.py at main · dqzg12300/unicornDemo (github.com)
main.py
1 | # This is a sample Python script. |
globalData.py
1 | #上一次汇编指令 |
参考
[原创]浅尝ollvm轻度混淆后的加密算法分析-Android安全-看雪-安全社区|安全招聘|kanxue.com
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/28/Android逆向解题-ollvm9/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!