导语
题目链接https://ctf.bugku.com/challenges/detail/id/239.html,这是一道CTF逆向的的题目。
文章目录
题目分析
那倒题目之后解压题目发现只有一个Jar包,如下所示。
也就是说我们要对这个Jar包进行反编译,找到解决问题的关键。这里我们介绍一款Java反编译的工具jd-gui-1.6.6,如下所示。
接下来我们就来反编译一下上面的Jar包。结果如下所示。
分析主类
反编译完成之后,接下来我们来分析一下主类信息。
从主类信息结果来看,首先需要我们输入一个四位长度的密码,然后通过如下的逻辑来判断密码是否正确才能进入到后续的类加载逻辑中。
接下来就需要我们研究一下如何进行破解这个密码了,经过分析可以看到,对于这个数据的加密应该是一个类似于MD5的加密方式。既然我们知道了这个密码是一个四位长度的字符组合,所以通过遍历爆破力破解的方式也可以得到密码。
爆破密码
第一步,就需要我们列出所有的四位字母组合的内容,数据量大概是52的4次方7311616个,数据量不是太大,如下所示。
public class FourDigitCombinations {
// 定义所有可能的字符:数字0-9和字母A-Z
//private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklimopqrstuvwxyz";
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklimopqrstuvwxyz";
private static final int STRING_LENGTH = 5; // 字符串长度
public static List<String> combinationsReturn() {
List<String> combinations = generateAllCombinations(CHARACTERS, STRING_LENGTH);
return combinations;
}
// 生成所有可能的指定长度的字符串组合
public static List<String> generateAllCombinations(String characters, int length) {
List<String> combinations = new ArrayList<>();
char[] charArray = characters.toCharArray();
generateCombinations(charArray, length, 0, new StringBuilder(length), combinations);
return combinations;
}
// 递归生成组合
private static void generateCombinations(char[] charArray, int length, int index, StringBuilder current, List<String> combinations) {
if (index == length) {
combinations.add(current.toString());
return;
}
for (char c : charArray) {
// 使用append而不是setCharAt
StringBuilder newCurrent = new StringBuilder(current); // 复制当前的StringBuilder以避免并发修改问题
newCurrent.append(c); // 添加当前字符到新的StringBuilder中
generateCombinations(charArray, length, index + 1, newCurrent, combinations); // 递归调用,传入新的StringBuilder
}
}
}
第二步、接下来就是通过上面反编译之后的代码中的加密逻辑来暴力破解一下这个密码,逻辑就是根据生成的所有可能的密码组合来通过上面给出的加密方式加密之后对比加密之后的数据是否是我们需要的数据。
public class TestMain {
// 将十六进制字符串转换成Byte数组
public static byte[] hexStringToByteArray(String hexString) {
int len = hexString.length();
byte[] byteArray = new byte[len / 2];
for (int i =
标签:NUAACTF,Reverse,nuaactf,int,StringBuilder,密码,length,static,combinations
From: https://blog.csdn.net/nihui123/article/details/144771258