Java逆向
本周的题目非常之简单,所以不会像之前的解析那么详细。
直接给出解题步骤。
.class文件
.class文件是.java文件编译后的产物,它类似于C语言中的.c文件编译而成的.s文件。
我们写一个简单的C文件。
gcc main.c -S -o Main.s
然后在终端输入 more Main 就可以看到编译后的汇编文件。
那么.class文件和.s文件非常之类似,我们可以使用IDEA打开.class文件,
没有下载IDEA的同学可以在software.redrock.team下载。
02 使用IDEA打开文件
打开之后能直接看到java代码,IDEA自带反编译插件。
有同学可能会觉得我没学过java,做不出来。其实没关系的,代码的思路都是差不多的,基础的语法也是类似的。其实看两眼,和C语言也差不多了,
printf 函数还是printf函数
只不过多了System.out.
ArryList 看起来比较吓人,但其实也只是一个数组它和 int arr[]的区别在于ArryList是动态数组并且有更多的功能。比如ResultList.add(result)可以方便的向数组的加入一个新元素,而不用像C语言需要指定下标来加元素。
代码分析
import java.util.Scanner;
import java.util.ArrayList;
public class Reverse {
public Reverse() {
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in); // 创建一个输入器,用来接受输入
System.out.println("Please input the flag :"); // 输出提示信息
String str = s.next(); // s.next()接受下一串字符串
System.out.println("Your input is :"); // 输出提示信息
System.out.println(str); // 输出信息
char[] stringArr = str.toCharArray(); // 将字符串类转换为 C-style 字符型数组
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] + 64 ^ 32; // 临时变量 result 的值 = arr[i] +64^32;
Resultlist.add(result); // 将计算结果添加到Resultlist
}
int[] KEY = new int[] { 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191,
65 }; // 新建一个 int 数组Key
ArrayList<Integer> KEYList = new ArrayList(); // 新建一个KEYlist 数组
for (int j = 0; j < KEY.length; ++j) {
KEYList.add(KEY[j]); // 将Key中的元素赋值到KeyList中
}
System.out.println("Result:");
if (Resultlist.equals(KEYList)) { // 进行判断等于KEYList就输出正确。
System.out.println("Congratulations!");
} else {
System.err.println("Error!");
}
}
}
解密脚本:
python语言
运行脚本得到flag
最后
这次的题目很简单,但涉及的语言会多,其实用C语言也能写这个脚本,但还是选择用Python,希望大家能够多多了解一些知识,扩展下知识面。
最后给大家一个学习指南,本章所涉及的:
-
简单的java语法
-
Python 列表
-
Python for-in循环
-
Python 数值转字符chr(),ord()函数
-
Python 列表解析式
国庆快乐!
我也要去上大分Happy去了