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

高研班11月试题

2021-11-11 16:32
25504

找出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
  • 完成对APP的算法分析
  • 实现注册机,对任意用户名可以生成对应的密钥,并验证通过
  • 请找出flag

  • [注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

    最后于 2021-11-11 16:38 被看雪高研编辑 ,原因:
    上传的附件:
    收藏
    免费 4
    支持
    分享
    最新回复 (14)
    雪    币: 1310
    活跃值: (727)
    能力值: ( LV6,RANK:90 )
    在线值:
    发帖
    回帖
    粉丝
    2
    kanxuenbkanxuenb
    2021-11-13 23:27
    0
    雪    币: 1262
    活跃值: (275)
    能力值: ( 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
    雪    币: 5036
    活跃值: (3295)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    4
    对输入的username 进行AES-128-ECB加密 key="kanxuenbkanxuenb" Base64以后就是密码
    2021-11-15 16:33
    0
    雪    币: 38
    活跃值: (466)
    能力值: ( 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
    活跃值: (275)
    能力值: ( 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
    活跃值: (3788)
    能力值: (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
    活跃值: (275)
    能力值: ( LV4,RANK:50 )
    在线值:
    发帖
    回帖
    粉丝
    9
    海风月影 有影 有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名 ...
    感谢大佬提供的帮助,我也已经完成了。(I-don't-love-r0ysue)哈哈哈!
    2021-11-17 19:15
    0
    雪    币: 1350
    活跃值: (3094)
    能力值: ( LV5,RANK:74 )
    在线值:
    发帖
    回帖
    粉丝
    10
    有影 试着做了 2W班试题11. 完成对APP的算法分析2. 实现注册机,对任意用户名可以生成对应的密钥,并验证通过import&nbsp;javax.crypto.Cipher; import& ...
    用户名在4位以下时验证失败不知道什么原因
    2021-11-18 00:09
    0
    雪    币: 1262
    活跃值: (275)
    能力值: ( 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
    雪    币: 10940
    活跃值: (7314)
    能力值: ( 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
    雪    币: 2973
    活跃值: (4886)
    能力值: ( LV5,RANK:60 )
    在线值:
    发帖
    回帖
    粉丝
    15
    膜拜各位大师傅
    2022-2-11 19:04
    0
    游客
    登录 | 注册 方可回帖
    返回
    //