给的是一个Java
字节码文件,
Java
字节码的反编译还是比较容易的, 可以直接拿到源码,
采用jad
反编译
jad反编译工具: 官网
Java源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
import java.io.PrintStream; import java.util.ArrayList; import java.util.Scanner;
public class Reverse {
public Reverse() { }
public static void main(String args[]) { Scanner s = new Scanner(System.in); System.out.println("Please input the flag \uFF1A"); String str = s.next(); System.out.println("Your input is \uFF1A"); System.out.println(str); char stringArr[] = str.toCharArray(); Encrypt(stringArr); }
public static void Encrypt(char arr[]) { ArrayList 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 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\uFF01"); else System.err.println("Error\uFF01"); } }
|
没学过Java
, 网上查了查不懂的地方,
这个程序的进行的操作如下:
把输入的字符串转成一个char
数组,
char
数组的每个元素加上64
再与0x20
异或,
再转成Integer
类型放进列表Resultlist
,
把KEY
数组的每个元素也逐个转成Integer
类型添加到另一个列表KEYList
,
逐个元素比较判断Resultlist
和KEYList
是否相等
这里再次用到了关于异或的知识点, 见[BUUCTF]xor
解密代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <cstdio>
using namespace std;
int main() { char str[] = { 180, 136, 137, 147, 191, 137, 147, 191, 148, 136,133, 191, 134, 140, 129, 135, 191, 65 }; for (int i = 0; i < sizeof(str); i++) { str[i] ^= 0x20; str[i] -= 64; putchar(str[i]); } }
|
所以flag就是flag{This_is_the_flag_!}