jc021227 发表于 2023-2-7 19:13

2023春节解题领红包安卓三、四

第三题

打开软件,提示点击999下获得flag,不多想,直接上连点器,顺利获取flag



这种方法有个bug,点击速度太快会卡死,设置点击间隔500ms放一会就出答案了
下面来分析一下代码



只有一步decrypt,修改掉kotlin的方法运行即可得到答案


第四题

打开软件,要求输入uid和flag,随便输入提示flag错误
直接拖进jadx反编译




关键的类就几个,看判断条件是调用A类的B方法验证,两个参数其实就是输入的uid和flag
下面直接找到A类的B方法



第一个判断条件的意思是flag要以"flag{"开头,"}"结束,然后截取大括号里面的字符串用作判断
接下来把uid和字符串"Wuaipojie2023"进行拼接
还有几行是用来创建对象,类型转换,直接跳过看返回值,发现这一串方法调用:c.cipher(mD5Utils.MD5(base64Utils.encodeToString(bytes)), 5)
第一层加密是base64,第二层是md5,不用多说
第三层这个cipher并不是库函数,发现它位于自定义的C类,直接找到源码



思路是复制下来运行,但它用到了kotlin库的compare,简单改写一下就能运行了
java代码如下:
import java.util.Base64;
import java.security.MessageDigest;
public class Solve {
    public static void main(String args[]) {
      String p0 = "1048772Wuaipojie2023";
      p0 = encode(p0);
      byte bytes[] = p0.getBytes();
      p0 = Base64.getEncoder().encodeToString(bytes);
      p0 = getMD5(p0);
      p0 = cipher(p0, 5);
      System.out.println("flag{" + p0 + "}");
    }

    public static String encode(String p0) {
      int i = p0.length();
      char uocharArray[] = new char;
      i = i - 1;
      while (i >= 0) {
            int i1 = i - 1;
            int i2 = p0.charAt(i) ^ 0x35;
            uocharArray = (char) i2;
            if (i1 < 0) {
                break;
            } else {
                i = i1 - 1;
                i2 = p0.charAt(i1) ^ 0x32;
                uocharArray = (char) i2;
            }
      }
      return new String(uocharArray);
    }

    public static char cipher(char p0, int p1) {
      int i = (Character.isUpperCase(p0)) ? 65 : 97;
      return (char)((char)((((char)(p0 - i) + (p1 % 26)) + 26) % 26) + i);
    }

    public static String cipher(String p0, int p1) {
      String str = "";
      int i = p0.length();
      int i1 = 0;
      while (i1 < i) {
            if ((p0.charAt(i1) >= 65) && (p0.charAt(i1) <= 90)) {
                str = str + cipher(p0.charAt(i1), p1);
            } else if ((p0.charAt(i1) < 97) || (p0.charAt(i1) > 122)) {
                str = str + p0.charAt(i1);
            } else {
                str = str + cipher(p0.charAt(i1), p1);
            }
            i1 = i1 + 1;
      }
      return str;
    }

    public static String getMD5(String text) {
      String md5str = "";
      try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte result[] = md.digest(text.getBytes());
            md5str = bytesToHex(result);
      } catch (Exception e) {
            e.printStackTrace();
      }
      return md5str;
    }

    public static String bytesToHex(byte bytes[]) {
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < bytes.length; i++) {
            int number = bytes & 0xff;
            String hex = Integer.toHexString(number);
            if (number >= 0 && number < 16) {
                sb.append("0" + hex);
            } else {
                sb.append(hex);
            }
      }
      return sb.toString();
    }
}



成功如图

侃遍天下无二人 发表于 2023-2-7 21:30

爱飞的猫 发表于 2023-2-7 21:01
下次改成 0x7fff_ffff 吧

其实改成-1就行了{:301_998:}

侃遍天下无二人 发表于 2023-2-7 20:27

好家伙,我只是写着玩的,没想到还真有上连点器的啊

sw7057 发表于 2023-2-7 20:22

学习了,长知识了。

爱飞的猫 发表于 2023-2-7 21:01

侃遍天下无二人 发表于 2023-2-7 20:27
好家伙,我只是写着玩的,没想到还真有上连点器的啊

下次改成 0x7fff_ffff 吧

正己 发表于 2023-2-7 21:59

爱飞的猫 发表于 2023-2-7 21:01
下次改成 0x7fff_ffff 吧

便宜这些点击仔了{:301_973:}

bluefirejl 发表于 2023-2-7 22:33

侃遍天下无二人 发表于 2023-2-7 21:30
其实改成-1就行了

我把0x3e7改成0x2

xhj666 发表于 2023-2-7 22:47

哈哈,没想到

Remon1900 发表于 2023-2-7 23:07

谢谢大佬,虽然看不懂也不会用

jyjjf 发表于 2023-2-8 09:25

侃遍天下无二人 发表于 2023-2-7 20:27
好家伙,我只是写着玩的,没想到还真有上连点器的啊

我就是偷懒用的连点器,第一次还过头了没设置次数
页: [1] 2
查看完整版本: 2023春节解题领红包安卓三、四