本周的题目非常之简单,所以不会像之前的解析那么详细。
直接给出解题步骤。
.class文件是.java文件编译后的产物,它类似于C语言中的.c文件编译而成的.s文件。
我们写一个简单的C文件。
gcc main.c -S -o Main.s
然后在终端输入 more Main 就可以看到编译后的汇编文件。
那么.class文件和.s文件非常之类似,我们可以使用IDEA打开.class文件,
没有下载IDEA的同学可以在software.redrock.team下载。
打开之后能直接看到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去了