BUUCTF在线评测 (buuoj.cn)BUUCTF在线评测 (buuoj.cn)
jadx 1.4.4安装:jadx-gui-1.4.4 反编译工具使用教程 - 莫贞俊晗 - 博客园 (cnblogs.com)
认识.class:
Java-初识 .class 文件_class文件怎么打开-CSDN博客
用查壳工具也可以知道是java写的
放到jadx里,在源代码里找到main()函数
这里有两步,第一步:是在主函数main
上输入flag,再调用Encrypt()
来进行加密
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Please input the flag );
String str = s.next();
System.out.println("Your input is );
System.out.println(str);
char[] stringArr = str.toCharArray();
Encrypt(stringArr);
}
第二步就是通过逆向Encrypt()
函数来获取flag
public static void Encrypt(char[] arr) {
ArrayList<Integer> Resultlist = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
int result = arr[i] + 64 ^ 0x20;
Resultlist.add(Integer.valueOf(result));
}
int[] KEY = {
180, 136, 137, 147, 191, 137, 147, 191, 148, 136,
133, 191, 134, 140, 129, 135, 191, 65 };
ArrayList<Integer> KEYList = new ArrayList<>();
for (int j = 0; j < KEY.length; j++)
KEYList.add(Integer.valueOf(KEY[j]));
System.out.println("Result:");
if (Resultlist.equals(KEYList)) {
System.out.println("Congratulations);
} else {
System.err.println("Error);
}
}
public static void Encrypt(char[] arr) {
ArrayList<Integer> Resultlist = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
int result = arr[i] + 64 ^ 0x20;
Resultlist.add(Integer.valueOf(result));
}
int[] KEY = {
180, 136, 137, 147, 191, 137, 147, 191, 148, 136,
133, 191, 134, 140, 129, 135, 191, 65 };
ArrayList<Integer> KEYList = new ArrayList<>();
for (int j = 0; j < KEY.length; j++)
KEYList.add(Integer.valueOf(KEY[j]));
System.out.println("Result:");
if (Resultlist.equals(KEYList)) {
System.out.println("Congratulations);
} else {
System.err.println("Error);
}
}
for (int i = 0; i < arr.length; i++)
int result = arr[i] + 64 ^ 0x20;
然后再和KEY进行比较,相等就是我们要求的flag了
if (Resultlist.equals(KEYList))
System.out.println("Congratulations);
这里放上Python的求解代码:
key = [ 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 ]
flag = ""
for i in range(0,len(key)):
for x in range(0,1024): # 这里通过暴力破解来获取flag
temp = x + 64 ^ 0x20 # 每个字符都加上固定的64 ^ 0x20
if temp == key[i]: # 如果相等就表示这是我们要的flag字符
flag = flag + chr(x)
break
print("flag{"+flag+"}")
#flag{This_is_the_flag_!}
本题考查了Java逆向,用jadx打开java编写的.class文件,找到关键函数,本题只用普通的异或,写个脚本爆破就可以