1225教学内容(apk、流量分析)
(1)

1225网安小分队线上活动

apk逆向

1.jpg
2021汉林杯ctf决赛

apk1

1.png

if(输入==正确的flag)

print("正确")

flag{ashdiasdka_jaskdawn}


 if (ctf.check_flag(this.edt_flag.getText().toString())) {

1、函数的嵌套

A(b())

if (check_flag_format(flag) && check_flag_content())

1、flag长度==38

2、flag内字符长度32位

3、flag内字符32位都是数字

    public static boolean isNumeric(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

4、下角标为奇数的值 值等于原来的-2

        for (int i = 0; i < 32; i++) {
            if ((i + 1) % 2 == 0) {
                flag_bytes[i] = (byte) (flag_bytes[i] - 2);
            }
        }

5、将转换后结果每八位分成一组 一共四组

    this.flag_content = str;
        this.flag_content1 = str.substring(0, 8);
        this.flag_content2 = this.flag_content.substring(8, 16);
        this.flag_content3 = this.flag_content.substring(16, 24);
        this.flag_content4 = this.flag_content.substring(24, 32);

6、将每八位进行get_hash 并且要跟指定的字符串相等

String str2 = get_hash(this.flag_content1.getBytes());
        this.flag_content1 = str2;
        if (!str2.equals(this.final_string1)) {
            return false;
    private String final_string1 = "9258b06d8f1e4cee6b162a972ab4e022";
    private String final_string2 = "f52fe436ba1a8e0170efec528017c042";
    private String final_string3 = "1ae4e191e6fbd7d66154ce20f6a4dc16";
    private String final_string4 = "156a6d4a56443c80ddbe04097aeed769";

get_hash

 private String get_hash(byte[] bytes) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(bytes);
            byte[] byteArray = md5.digest();
            StringBuilder sb = new StringBuilder();
            int length = byteArray.length;
            for (int i = 0; i < length; i++) {
                sb.append(String.format("%02x", Byte.valueOf(byteArray[i])));
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

10000000-99999999

1、用所有的八位数 get_hash

2、如果结果与给定的字符串相等。即为该段flag

3、对flag的下坐标为奇数的值进行+2

apk2

2.png

 if (ctf.check_flag(this.edt_flag.getText().toString()))

if (check_flag_format(flag) && check_flag_content()) {

1、flag长38位 中间内容32位

 private boolean check_flag_format(String flag) {
        if (flag.length() != 38) {
            return false;
        }
        try {
            String substring = flag.substring(flag.indexOf("flag{") + "flag{".length(), flag.indexOf("}"));
            this.flag_content = substring;
            if (substring.length() == 32) {
                return true;
            }
            return false;
        } catch (Exception e) {
            return false;
        }
    }

2、如果flag中间内容下角标为偶数 让其值对102进行异或

        for (int i = 0; i < 32; i++) {
            if (i % 2 == 0) {
                flag_bytes[i] = (byte) (flag_bytes[i] ^ 102);
            }
        }

3、将中间内容反转

        while (i2 < 32) {
            flag_bytes1[i2] = flag_bytes[j];
            i2++;
            j--;

4、进行base64编码

String replace = new String(Base64.encode(flag_bytes1, 0)).replace("\n", "")

5、跟字符串进行比较

private String final_string = "MQM1V2JVM1ZiVDReNl9kADlSYVY3VTMCMAc2BTZTM1cA";

poc:

1、base64解码

2、将内容反转

3、进行逆异或

misc流量分析

1、flag{This_is_a_f10g}

2、flag{7FoM2StkhePz}

3、key{8769fe393f2b998fa6a11afe2bfcd65e}

参考https://www.it610.com/article/1276718680939446272.htm

附件下载

1225.zip

本文为作者admin发布,未经允许禁止转载!
上一篇 下一篇
评论
暂无评论 >_<
加入评论