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:01
下次改成 0x7fff_ffff 吧
其实改成-1就行了{:301_998:} 好家伙,我只是写着玩的,没想到还真有上连点器的啊 学习了,长知识了。 侃遍天下无二人 发表于 2023-2-7 20:27
好家伙,我只是写着玩的,没想到还真有上连点器的啊
下次改成 0x7fff_ffff 吧 爱飞的猫 发表于 2023-2-7 21:01
下次改成 0x7fff_ffff 吧
便宜这些点击仔了{:301_973:} 侃遍天下无二人 发表于 2023-2-7 21:30
其实改成-1就行了
我把0x3e7改成0x2 哈哈,没想到 谢谢大佬,虽然看不懂也不会用 侃遍天下无二人 发表于 2023-2-7 20:27
好家伙,我只是写着玩的,没想到还真有上连点器的啊
我就是偷懒用的连点器,第一次还过头了没设置次数
页:
[1]
2