打开软件,提示点击999下获得flag,不多想,直接上连点器,顺利获取flag
1.jpg (72.77 KB, 下载次数: 0)
下载附件
2023-2-7 17:10 上传
这种方法有个bug,点击速度太快会卡死,设置点击间隔500ms放一会就出答案了
下面来分析一下代码
8.png (43.64 KB, 下载次数: 0)
下载附件
2023-2-7 19:11 上传
只有一步decrypt,修改掉kotlin的方法运行即可得到答案
第四题
打开软件,要求输入uid和flag,随便输入提示flag错误
直接拖进jadx反编译
3.png (14.12 KB, 下载次数: 0)
下载附件
2023-2-7 18:42 上传
2.png (32.96 KB, 下载次数: 0)
下载附件
2023-2-7 18:41 上传
关键的类就几个,看判断条件是调用A类的B方法验证,两个参数其实就是输入的uid和flag
下面直接找到A类的B方法
4.png (38.47 KB, 下载次数: 0)
下载附件
2023-2-7 18:45 上传
第一个判断条件的意思是flag要以"flag{"开头,"}"结束,然后截取大括号里面的字符串用作判断
接下来把uid和字符串"Wuaipojie2023"进行拼接
还有几行是用来创建对象,类型转换,直接跳过看返回值,发现这一串方法调用:c.cipher(mD5Utils.MD5(base64Utils.encodeToString(bytes)), 5)
第一层加密是base64,第二层是md5,不用多说
第三层这个cipher并不是库函数,发现它位于自定义的C类,直接找到源码
5.png (28.89 KB, 下载次数: 0)
下载附件
2023-2-7 18:55 上传
思路是复制下来运行,但它用到了kotlin库的compare,简单改写一下就能运行了
java代码如下:
[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 = 65) && (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 = 0 && number
6.png (116.25 KB, 下载次数: 1)
下载附件
2023-2-7 19:07 上传
成功如图
7.jpg (85.14 KB, 下载次数: 0)
下载附件
2023-2-7 19:09 上传