Crack App | yrx App 对抗赛第二、第三题加密签名对抗

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Crack App | yrx App 对抗赛第二、第三题加密签名对抗

今日目标

昨天整了个珍惜逆向的团购,当了一晚上的客服,结果还是很多人错过拍大腿了,算了算了  还是老老实实写文章吧

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

没有搭好环境的可以照着下面的链接先搭建一下

Crack App | 初试 Unidbg 环境搭建

这个appso命名很规范,所以不用看java层的加载代码也能很快的知道so是哪个

先把这个libmatch02.so复制出来

打开搭建好的unidbg项目,并创建一个app2的包,并将apkso都放进去

新建一个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结果如下

这个strpage+time*1000

timetime*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());
    }

逻辑的其他部分除了要替换apkso的路径之外,其他完全一样

以上就是yrx 的第二、第三题的题目讲解了,还好不限制Unidbg,不然连第二第三题就已经把我干掉了

End.

相关文章
|
7月前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
964 0
|
7月前
|
JSON 小程序 数据安全/隐私保护
小程序动态调试-解密加密数据与签名校验
本文主要讲解微信小程序加密、验签的情况下如何进行动态调试已获取签名以及加密信息
|
7月前
|
算法 安全 Java
Java 实现 RSA 非对称加密算法-加解密和签名验签
Java 实现 RSA 非对称加密算法-加解密和签名验签
295 0
|
Android开发 iOS开发 MacOS
APP备案公钥、证书MD5指纹/签名MD5值获取最简单方法
APP备案公钥、证书MD5指纹/签名MD5值获取方法,Android安卓平台、Windows平台、macOS平台,三个平台获取方法, Android平台使用 APP备案助手,各大安卓应用市场搜索 APP备案助手 即可,Windows/macOS平台使用jadx-gui工具。
3598 2
|
开发工具 Android开发 iOS开发
2023年APP备案操作教程 阿里云APP备案试列 APP公钥sha1签名获取方法
核心要点:A,域名之前是哪里备案的,APP备案就到哪里去做,方便简单;B,APP备案核心预存信息为APP包名、MD5指纹(安卓)、sha1签名(IOS)、公钥;这3个信息请找APP开发人员获取;一门开发的可以自行到开发者后台【配置】-【证书与包名】获取对应安卓、苹果APP信息。
|
3月前
|
算法 安全 网络安全
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
164 0
|
4月前
|
JavaScript 前端开发 安全
VUE——APP,后端,前端三端AES加密解密
VUE——APP,后端,前端三端AES加密解密
179 0
|
7月前
|
Android开发 开发者
 一键在线获取APP公钥、包名、签名及备案信息方法介绍
本文介绍了一款在线APP解析工具,可以一键获取APP的公钥、包名、签名等基础信息,同时提供了详细的操作步骤和使用示例,帮助开发者更便捷地进行APP备案信息的获取。
|
7月前
|
XML 前端开发 Java
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
Android App实战项目之实现手写签名APP功能(附源码,简单易懂 可直接实用)
299 0
|
7月前
|
开发工具 Android开发
APP 备案公钥、签名 MD5、SHA-1、SHA-256获取方法。
APP 备案公钥、签名 MD5、SHA-1、SHA-256获取方法。
697 0