[0xFA-2021][Buuctf]Java逆向1

Java逆向

本周的题目非常之简单,所以不会像之前的解析那么详细。
直接给出解题步骤。

.class文件

.class文件是.java文件编译后的产物,它类似于C语言中的.c文件编译而成的.s文件。
我们写一个简单的C文件。
[0xFA-2021][Buuctf]Java逆向1

gcc main.c  -S -o Main.s

然后在终端输入 more Main 就可以看到编译后的汇编文件。
[0xFA-2021][Buuctf]Java逆向1
那么.class文件和.s文件非常之类似,我们可以使用IDEA打开.class文件,
没有下载IDEA的同学可以在software.redrock.team下载。

02 使用IDEA打开文件

[0xFA-2021][Buuctf]Java逆向1
打开之后能直接看到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语言
[0xFA-2021][Buuctf]Java逆向1
运行脚本得到flag

最后

这次的题目很简单,但涉及的语言会多,其实用C语言也能写这个脚本,但还是选择用Python,希望大家能够多多了解一些知识,扩展下知识面。
最后给大家一个学习指南,本章所涉及的:

  • 简单的java语法

  • Python 列表

  • Python for-in循环

  • Python 数值转字符chr(),ord()函数

  • Python 列表解析式

国庆快乐!
我也要去上大分Happy去了

上一篇:buuctf-[极客大挑战 2019]Http 1


下一篇:javascript8图片刹车运动