NUAACTF-2017-Reverse题目nuaactf解题思路

NUAACTF-2017逆向题nuaactf解题思路

导语
  题目链接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 = 0; i < len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值