首页
社区
课程
招聘
高研班11月试题
发表于: 2021-11-11 16:32 25403

高研班11月试题

2021-11-11 16:32
25403

找出flag 如果输入正确则屏幕上的 hello会变成success 失败会变成erro

分析出KanxueSign函数的算法

  1. 完成对APP的算法分析
  2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过
  1. 请找出flag
  2. 函数抽取壳的导致了被保护的函数始终运行在解释模式下。提供的pixel镜像已经将默认解释器修改成了Switch实现,请分析该Switch解释器,并编写frida hook脚本,能够实现对解释器解释执行的每一条smali指令的跟踪记录。提供的测试apk采用了自解密的函数抽取技术。
  3. 请分析并快速定位该VMP壳的解释器引擎,并编写frida脚本攻克该VMP保护的函数
    地址:https://pan.baidu.com/s/18bnXkPJVxoaYJhu0MAE5BQ
    提取码:ttis
  1. 高研班网课开放报名喔。
  2. 有效期为自报名后的两年噢,且每年船型更新内容。
  3. 报名即进班级群、赠送手机硬盘;
  4. 课程发布贴:https://bbs.pediy.com/thread-267018.htm
  5. 报名地址:
    月薪三万计划:https://www.kanxue.com/book-brief-84.htm
    月薪两万链接:https://www.kanxue.com/book-brief-83.htm
最后于 2021-11-11 16:38 被看雪高研编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (14)
雪    币: 1310
活跃值: (727)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
kanxuenbkanxuenb
2021-11-13 23:27
0
雪    币: 1262
活跃值: (270)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3

试着做了 2W班试题1

1. 完成对APP的算法分析


2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class Keygen {
    public static final String PASSWORD = "kanxuenbkanxuenb";

    public static void main(String[] args) {
        String username = "chenxf";
        try {
            String code = getCodeKey(username);
            System.out.println(code);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String getCodeKey(String username) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(PASSWORD.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        byte[] encrypted = cipher.doFinal(username.getBytes());
        return  Base64.getEncoder().encodeToString(encrypted);
    }
}

成功截图:

最后于 2021-11-16 15:54 被有影编辑 ,原因:
2021-11-15 01:05
0
雪    币: 4892
活跃值: (3180)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
对输入的username 进行AES-128-ECB加密 key="kanxuenbkanxuenb" Base64以后就是密码
2021-11-15 16:33
0
雪    币: 38
活跃值: (451)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

两万班第二题:


一加 Android10:


11-15 22:43:11.998 31811 31811 F DEBUG   : backtrace:

11-15 22:43:11.998 31811 31811 F DEBUG   :       #00 pc 00000000000020e8  /data/app/com.r0ysue.test-ozDje-DvpEBy7ufRVuHxaA==/lib/arm64/libnative-lib.so (BuildId: 48b237b93c746d554cdbc7d49cc6b1b1d03b2d88)

11-15 22:43:11.998 31811 31811 F DEBUG   :       #01 pc 0000000000003090  /data/app/com.r0ysue.test-ozDje-DvpEBy7ufRVuHxaA==/lib/arm64/libnative-lib.so (Java_com_r0ysue_test_MainActivity_stringFromJNI+504) (BuildId: 48b237b93c746d554cdbc7d49cc6b1b1d03b2d88)

11-15 22:43:11.998 31811 31811 F DEBUG   :       #02 pc 0000000000140350  /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: a7b90c4876fad384278d03bbb11492c6)

11-15 22:43:11.998 31811 31811 F DEBUG   :       #03 pc 0000000000137334  /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: a7b90c4876fad384278d03bbb11492c6)

11-15 22:43:11.998 31811 31811 F DEBUG   :       #04 pc 0000000000145fec  /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+244) (BuildId: a7b90c4876fad384278d03bbb11492c6)


三星 Android11:

11-15 22:47:41.862 15711 15711 F DEBUG   : backtrace:

11-15 22:47:41.862   641   641 I Layer   : id=12734[1] Destroyed Surface(name=WallpaperWindowToken{84ef6f1 token=android.os.Binder@2774e98})/@0x565bd00 - animation-leash#0

11-15 22:47:41.862 15711 15711 F DEBUG   :       #00 pc 000000000004a620  /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+144) (BuildId: 890b75bbb1eaed1155b47ab37b7aad70)

11-15 22:47:41.862   641   641 I Layer   : id=12732[1] Destroyed Surface(name=Task=1)/@0xd8a3fe3 - animation-leash#0

11-15 22:47:41.862 15711 15711 F DEBUG   :       #01 pc 00000000000016e0  /data/app/~~Q96OvX1_j7xipXl2BMlCRQ==/com.r0ysue.test-7BtHGKvm3ptN1zzPEjxw7Q==/lib/arm64/libnative-lib.so (BuildId: 48b237b93c746d554cdbc7d49cc6b1b1d03b2d88)

11-15 22:47:41.862 15711 15711 F DEBUG   :       #02 pc 0000000000001f68  /data/app/~~Q96OvX1_j7xipXl2BMlCRQ==/com.r0ysue.test-7BtHGKvm3ptN1zzPEjxw7Q==/lib/arm64/libnative-lib.so (BuildId: 48b237b93c746d554cdbc7d49cc6b1b1d03b2d88)

11-15 22:47:41.862 15711 15711 F DEBUG   :       #03 pc 00000000000030c0  /data/app/~~Q96OvX1_j7xipXl2BMlCRQ==/com.r0ysue.test-7BtHGKvm3ptN1zzPEjxw7Q==/lib/arm64/libnative-lib.so (Java_com_r0ysue_test_MainActivity_stringFromJNI+552) (BuildId: 48b237b93c746d554cdbc7d49cc6b1b1d03b2d88)

11-15 22:47:41.862 15711 15711 F DEBUG   :       #04 pc 000000000013eed4  /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: bd4bbcfee9112dc043c9dc3ab6bd8478)

11-15 22:47:41.862 15711 15711 F DEBUG   :       #05 pc 0000000000135564  /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: bd4bbcfee9112dc043c9dc3ab6bd8478)


两台手机都安装软件后都崩溃, 没法测试;

答案好像是: 692d686174652d723079737565

那个好心大佬帮我测试一下

2021-11-15 22:50
0
雪    币: 1601
活跃值: (5159)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
五角星 两万班第二题:一加 Android10:11-15 22:43:11.998 31811 31811 F DEBUG   : backtrace:11-15 22: ...
大佬这里 没做适配 建议使用 android8.1 试一下
2021-11-16 10:47
0
雪    币: 1262
活跃值: (270)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
    有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过import javax.crypto.BadPaddingExcept ...

2W班试题2:

    1. 刚刚开始分析由于我自己的 redmi note 7 pro (Android 10) 运行出错,用了静态分析,Java层面算法答案是:“i-hate-r0ysue”。反向代码如下。

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class Decrypt {
    public static byte[] su = {-66, -81, 25, -66, 122, -8, 42, -10, 78, -117, 104, -17, 118, -27, 40, -80, -20, 40, -60, -80, -11, -5, 75, 5, 100, 47, -48, 42, -119, -60, -66, 113};

    public static void main(String[] args) {
        int[] passwordArr = decrypt(su);
        String password = decryptPassword(passwordArr);
        System.out.println(password);
    }

    public static String decryptPassword(int[] passwordArr) {
        String ming1 = Integer.toString(passwordArr[0], 16);
        String ming2 = Integer.toString(passwordArr[1], 16);
        String ming3 = Integer.toString(passwordArr[2], 16);
        String ming4 = Integer.toString(passwordArr[3], 16);
        String mingwen = ming1 + ming2 + ming3 + ming4;
        return hex2String(mingwen);
    }

    public static int[] decrypt(byte[] byteContent) {
        String password = "r0ysue-yyds";
        while (password.length() < 16) {
            password += "0";
        }
        try {
            SecretKeySpec secretKeySpec = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            byte[] result = cipher.doFinal(byteContent);
            String content =  new String(result);
            int[] arr = new int[4];
            arr[0] = Integer.parseInt(content.substring(0, 8),16);
            arr[1] = Integer.parseInt(content.substring(8, 16),16);
            arr[2] = Integer.parseInt(content.substring(16, 24),16);
            arr[3] = Integer.parseInt(content.substring(24, 26),16);
            return arr;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    public static String hex2String(String hexString) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < hexString.length(); i+=2) {
            sb.append((char) Integer.parseInt(hexString.substring(i, i + 2), 16));
        }
        return sb.toString();
    }

}

2. 后来借了朋友的Nexus 5X(Android 8.1)成功运行后,才发现是错误的。

3. 之后查看了 libnative-lib.so 反编译后的代码,才发现public int encrypt(int a, int b, int c, int d) 被 ART JNI 替换了。

4. 真正的加密函数是在sub_272C和sub_2128上,sub_2128函数反编译的代码和一些常量数组看着像 DES 加密。

对于sub_2128函数破解(DES加密,也有可能不是),我目前的能力有限。还无法破解。望大佬给个破解思路。

楼下8楼已经给出思路,再次谢谢大佬。

------------------------------------------------------------------------------------------------------------------------------------------

5. 先上 Frida Hook 观察sub_272C和sub_2128调用。

/// <reference path="frida-gum.d.ts" />
function hook_java() {
    Java.perform(function () {
        const mainActivity = Java.use("com.r0ysue.test.MainActivity");
        mainActivity.string2hex.implementation = function (string) {
            string = "abceefghijkln";
            console.log("called string2hex - ", string)
            var result = this.string2hex(string);
            console.log("return - ", result);
            return result
        }
    })
}

function hook_native() {
    var libnative_lib_addr = Module.getBaseAddress("libnative-lib.so")
    var sub_2128_fun_addr = libnative_lib_addr.add(0x2128)
    var sub_272C_fun_addr = libnative_lib_addr.add(0x272C)
    Interceptor.attach(sub_2128_fun_addr, {
        onEnter: function (args) {
             console.log("called sub_2128 ", args[0])
        },
        onLeave: function (retval) {
            console.log("sub_2128 retval ", retval);
            // retval.replace(1)
        }
    })
    Interceptor.attach(sub_272C_fun_addr, {
        onEnter: function (args) {
            console.log("called sub_272C ", args[2], args[3], args[4], args[5]);
        },
        onLeave: function (retval) {
            console.log("sub_272C retval ", retval)
            // retval.replace(1)
        }
    })

}
setTimeout(hook_native, 1000)
setImmediate(hook_java)
// frida -U -f com.r0ysue.test -l hook.js --no-pause

确认了 sub_2128 返回1是成功。


6. 根据8楼给出的DES代码(https://github.com/dhuertas/DES/blob/master/des.c),尝试在frida和DES的程序中输入一些值,确认是DES加密算法了。

frida


des.c

7.  使用 des.c里的解密算法完成解密。

8. hex to string 。

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class Decrypt2 {
    public static void main(String[] args) {
        System.out.println(
                hex2String("692d6c6f") +
                hex2String("76652d72") +
                hex2String("30797375") +
                hex2String("65")
        ); // i-love-r0ysue

    }

    public static String hex2String(String hexString) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < hexString.length(); i += 2) {
            sb.append((char) Integer.parseInt(hexString.substring(i, i + 2), 16));
        }
        return sb.toString();
    }
}


最后于 2021-11-17 19:37 被有影编辑 ,原因:
2021-11-16 15:34
0
雪    币: 7309
活跃值: (3783)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
8
有影 有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过import&nbsp ...

https://github.com/dhuertas/DES/blob/master/des.c
希望能帮到你


i don't love r0ysue

最后于 2021-11-17 15:24 被海风月影编辑 ,原因:
2021-11-17 15:19
0
雪    币: 1262
活跃值: (270)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
海风月影 有影 有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名 ...
感谢大佬提供的帮助,我也已经完成了。(I-don't-love-r0ysue)哈哈哈!
2021-11-17 19:15
0
雪    币: 1332
活跃值: (3074)
能力值: ( LV5,RANK:74 )
在线值:
发帖
回帖
粉丝
10
有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过import&nbsp;javax.crypto.Cipher; import& ...
用户名在4位以下时验证失败不知道什么原因
2021-11-18 00:09
0
雪    币: 1262
活跃值: (270)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
N1ptune 用户名在4位以下时验证失败不知道什么原因[em_31]

作者用的是PKCS7Padding方式。由于在Java中没有默认PKCS7Padding这个Padding,所以我用了PKCS5Padding的方式。Padding填充方式不一样导致的填充数据不一样。感谢指出问题,我最开始也没注意到这个问题。

最后于 2021-11-18 11:22 被有影编辑 ,原因:
2021-11-18 11:11
0
雪    币: 235
活跃值: (303)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12

无从下手............

2021-11-23 18:22
0
雪    币: 11063
活跃值: (7239)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
13
3w第一题 https://bbs.pediy.com/thread-270529.htm
2021-11-30 17:02
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
2w 第二题
r0ysue-yyds00000
692d686174652d723079737565
1
2022-2-11 17:11
0
雪    币: 2958
活跃值: (4851)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
15
膜拜各位大师傅
2022-2-11 19:04
0
游客
登录 | 注册 方可回帖
返回
//