1、题目
2、工具
- jd-gui:Java反汇编器。
-
- python:编写自动化脚本。
3、方法
- 下载压缩包,解压得到一个.class文件。
-
- 题目已经说了是java逆向,所以使用jd-gui打开该文件。
- 代码如下:
-
import java.io.PrintStream; import java.util.ArrayList; import java.util.Scanner;public class Reverse {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);}public static void Encrypt(char[] arr){ArrayList<Integer> Resultlist = new ArrayList();for (int i = 0; i < arr.length; i++){int result = arr[i] + '@' ^ 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! ");}} }
-
- 代码解析:
- 输入flag赋给str,将str转换为字符数组stringArr,并传递给Encrypt()函数。
- Encrypt()函数中的第一个for循环,是将stringArr数组中每个字符的ASCII码加上@的ASCII码值,然后与32进行异或加密,再存放在Resultlist中。
- 第二个for循环是将 KEY中的每一个元素存放到 KEYList列表中。
- 所以KEYList就是加密后的flag,只需要对KEYList进行反向操作即可。即把KEY中的每个元素与32进行异或操作,再减去@的ASCII值。
- 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(len(key)):flag += chr((key[i] ^ 32) - ord('@')) print(flag)
- 运行结果:
-