buuctf-Java逆向解密

下载后得到Reverse.class文件

 使用jadx打开它

buuctf-Java逆向解密_第1张图片

解读一下java代码

package defpackage;
 
import java.util.ArrayList;
import java.util.Scanner;
 
/* renamed from: Reverse  reason: default package */
/* loaded from: Reverse.class */
public class Reverse {
    public static void main(String[] args) {      
        Scanner s = new Scanner(System.in);//System.in读取标准输入设备数据,一般是键盘。System.out是输出
        System.out.println("Please input the flag :");//System.out.println相当于python的print
        String str = s.next();
        System.out.println("Your input is :");
        System.out.println(str);
        char[] stringArr = str.toCharArray();//toCharArray()将字符转换为一个字符数组。
        Encrypt(stringArr); //调用Encrypt对stringArr进行加密
    }
 
    public static void Encrypt(char[] arr) {  //定义Encrypt
        ArrayList Resultlist = new ArrayList<>();  //对Resultlist进行初始化
        for (char c : arr) {
            int result = (c + '@') ^ 32; //加密过程 
                                                          
                                                          
                                                          
            Resultlist.add(Integer.valueOf(result));//把result以整型返回,再添加到Resultlist里
        }
        int[] KEY = {180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65};
        ArrayList KEYList = new ArrayList<>();  //对keylist做初始化
        for (int i : KEY) {
            KEYList.add(Integer.valueOf(i));//把i以整型返回,再添加到KEYList里           
        }
        System.out.println("Result:");
        if (Resultlist.equals(KEYList)) {//判断resultlist和keylist相等
            System.out.println("Congratulations!");     
        } else {
            System.err.println("Error!");
        }
    }
}

关键加密代码是这个

for (char c : arr) {
int result = (c + '@') ^ 32; //加密过程                                                                                                                          
Resultlist.add(Integer.valueOf(result));//把result以整形返回,再添加到Resultlist里
}

该代码的意思是把输入的字符每一个都加上@的ascii码,再与32做异或,最后添加到resultlist里。

if (Resultlist.equals(KEYList)) {//判断resultlist和keylist相等
    System.out.println("Congratulations!");     
} else {
    System.err.println("Error!");
}

再由此处代码判断resultlist与keylist是否相等

所以我们的解题思路是把keylist中每个元素减去@的ascii码再与32做异或得到resultlist的值

因为两次异或就会得到原来的值

解题脚本

key=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
result =[]
flag=""
for i in range(len(key)):
    key[i] =key[i]-ord("@")^32
    result.append(key[i])

for i in range(len(result)):
    flag +=chr(result[i])

print("flag{"+flag+"}")

得到flag

 

你可能感兴趣的:(java,开发语言)