今日目标
昨天整了个珍惜逆向的团购,当了一晚上的客服,结果还是很多人错过拍大腿了,算了算了 还是老老实实写文章吧
aHR0cHM6Ly9hcHBtYXRjaC55dWFucmVueHVlLmNvbQ==
上一篇写了 yrx App 比赛的第一个题目
Crack App | yrx App 对抗赛第一题 Sign 算法的还原
今天搞一搞二、三题的加密签名,为什么把这两个放在一起写,是因为这两道题目有一个通用解法
Unidbg
即可以满足主办方的要求又可以完成 so 算法的脱机调用
第二题:so 层加密
抓包分析(第二题)
先来看看这第二题的请求包
time
+app2
两个请求包,主要看看app2
主要的参数很明显,还是sign
加密定位与分析(第二题)
根据上一篇文章
可以快速定位加密位置如下
这个sign
是下面的native
方法
既然开始就决定要使用unidbg
调用这个算法,那么就费劲拖到IDA
里分析了
只需要用Frida
确认sign
的出入参数,之后方便使用Unidbg
调用即可
使用下面的代码hook sign
console.log("脚本加载成功"); function main(){ Java.perform(function() { var clazz = Java.use('com.yuanrenxue.match2022.fragment.challenge.ChallengeTwoFragment'); clazz.sign.implementation = function(str) { console.log('find ======'); console.log('str ========>' + str) var result = this.sign(str) console.log("result =======>" + result) return result; } }); } setImmediate(main)
然后运行可以得到下面的打印结果
这里的str
就是入参,可以知道就是page+:+time
的组合
返回的结果看着很像Base64
先把出入参数复制保存起来,等最后和Unidbg
的结果做个对比
Unidbg 调用 so 算法(第二题)
之前写过一篇关于Unidbg
环境搭建的教程,里面讲了如何下载开源项目并成功运行第一个demo
没有搭好环境的可以照着下面的链接先搭建一下
这个app
的so
命名很规范,所以不用看java
层的加载代码也能很快的知道so
是哪个
先把这个libmatch02.so
复制出来
打开搭建好的unidbg
项目,并创建一个app2
的包,并将apk
和so
都放进去
新建一个MainActivity.java
文件,这个是我们调用so
主逻辑的代码存放位置
如果之前没有写过的话,可以参考Unidbg
自带的demo
下面直接附上主要的代码
public class MainActivity extends AbstractJni { private final AndroidEmulator emulator; private final VM vm; private final Memory memory; private final Module module; public MainActivity(){ // 创建模拟器实例(这里必须是 64bit 的版本,因为是 64 位的 so) emulator = AndroidEmulatorBuilder .for64Bit() .build(); // 获取内存 memory = emulator.getMemory(); // 设置解析器sdk版本 memory.setLibraryResolver(new AndroidResolver(23)); // 这里应该给一个 apk 的文件路径 //vm = emulator.createDalvikVM(); // 创建Android虚拟机,传入APK,Unidbg可以替我们做部分签名校验的工作 vm = emulator.createDalvikVM(new File("unidbg-android/src/test/java/com/app2/app-match-22.apk")); // 打印日志 vm.setVerbose(true); vm.setJni(this); // 加载 so DalvikModule dalvikModule = vm.loadLibrary(new File("unidbg-android/src/test/java/com/app2/libmatch02.so"), false); // 获取本SO模块的句柄 module = dalvikModule.getModule(); // 调用JNI OnLoad,可以看到JNI中做的事情,比如动态注册以及签名校验等。 vm.callJNI_OnLoad(emulator,module); } public static void main(String[] args) { long start = System.currentTimeMillis(); MainActivity mainActivity = new MainActivity(); System.out.println("load the vm "+( System.currentTimeMillis() - start )+ "ms"); mainActivity.getHash(); } }
这里面除了创建模拟器实例的时候需要用到的64bit
之外,其他都是正常的逻辑
然后只要写一个方法调用sign
就可以了
private void getHash() { DvmObject<?> dvmObject = vm.resolveClass("com/yuanrenxue/match2022/fragment/challenge/ChallengeTwoFragment").newObject(null); String input = "3:1652458832"; DvmObject<?> ret = dvmObject.callJniMethodObject(emulator, "sign(Ljava/long/String;)Ljava/long/String;", input); System.out.println("result ==>" + ret.getValue()); }
Unidbg
运行结果如下
和我们 hook 的结果一样,之后只要搭配Unidbg Server
就可以直接调用了
此为分割线
看过第二题的赶紧练起来,试试按照上面的思路把第三题做出来,做不出来再看下面的内容
说归说闹归闹,别拿点赞开玩笑,记得点赞
此为分割线
第三题:so 层加密带混淆
抓包分析(第三题)
第三题的抓包大同小异
也是time
+app3
两个请求包,主要看app3
这个请求包
主要的分析参数是m
加密定位与分析(第三题)
根据上一篇文章
可以定位到下面的位置
然后和第二题一样,使用Frida
确定出入参数就可以了,方便之后用Unidbg
调用
第三题的crypt
可以通过下面的代码hook
console.log("脚本加载成功"); function main(){ Java.perform(function() { var clazz = Java.use('com.yuanrenxue.match2022.fragment.challenge.ChallengeThreeFragment'); clazz.crypto.overload('java.lang.String', 'long').implementation = function(str,time) { console.log('find ======> crypt'); console.log("str ===> "+str) console.log("time ===> "+time) var result = this.crypto(str,time) console.log("result ====> " + result) return result; } }); } setImmediate(main)
hook
结果如下
这个str
是page+time*1000
time
是time*1000
同样的先把出入参数复制保存起来,等最后和Unidbg
的结果做个对比
Unidbg 调用 so 算法(第三题)
看过第二题的小伙伴都知道前面的步骤了,这里直接跳过环境搭建等步骤
直接上代码
private void getHash() { DvmObject<?> dvmObject = vm.resolveClass("com/yuanrenxue/match2022/fragment/challenge/ChallengeThreeFragment").newObject(null); String input = "懒得敲了"; Long time = 懒得敲了; DvmObject<?> ret = dvmObject.callJniMethodObject(emulator, "crypto(Ljava/lang/String;J)Ljava/lang/String;", input,time); System.out.println("result ==>" + ret.getValue()); }
逻辑的其他部分除了要替换apk
和so
的路径之外,其他完全一样
以上就是yrx
的第二、第三题的题目讲解了,还好不限制Unidbg
,不然连第二第三题就已经把我干掉了
End.