re题(16)BUUCTF-Java逆向解密
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): # 这里通过暴力破解来获取flagtemp = x + 64 ^ 0x20 # 每个字符都加上固定的64 ^ 0x20if temp == key[i]: # 如果相等就表示这是我们要的flag字符flag = flag + chr(x)break
print("flag{"+flag+"}")#flag{This_is_the_flag_!}
本题考查了Java逆向,用jadx打开java编写的.class文件,找到关键函数,本题只用普通的异或,写个脚本爆破就可以