CTF002

xiaoeryu Lv5

1. 通过hook脚本暴力破解

进入入口点之后,简单查看一下代码的逻辑

可以发现密码是一个六位数字,经过encode函数加密后跟预定的值进行比较,比较相等就通过。
查看这个encode函数使用了sha1摘要算法,这样我们并不能根据hook某一个点位直接获取到正确的密钥,
因为密码是六位数字存在暴力破解的可能,我们可以直接hook这个encode函数来做一个暴力破解。
因为这个_public class MainActivity extends Activity类不是一个静态类,所以不能直接通过类去调用里面的函数,所以不能直接用Java.use()_的方式写脚本,需要使用**choose()方法去内存中查找到类MainActivity**的实例之后再使用类方法

// 使用 setImmediate 在下一个事件循环中执行代码,防止脚本执行过程中报错Failed to load script: timeout was reached
setImmediate(function(){
  // 在 Java 环境中执行代码
  Java.perform(function(){
    // 寻找指定类的实例
    Java.choose("com.android.ctf.MainActivity",{
      // 当匹配到实例时的回调函数
      "onMatch":function(instance){
        console.log("找到实例");
        var str = Java.use("java.lang.String");
        var Integer = Java.use("java.lang.Integer")
        var start = 100000; // 起始值
        var end = 1000000; // 结束值
        for (var i = start; i < end; i++) {
          // 将整数转换为字符串
          var result = instance.encode(Integer.toString(i));
          if (result === "6574f28f75dddc488f3c7c21fddfa0cd16901206") {
            console.log("找到密码: " + i);
            return; // 找到密码后立即返回
          }
        }
      },
      // 堆搜索完成时的回调函数
      "onComplete":function(){
        console.log("堆搜索完成");
      }
    });
  });
});

执行脚本:这个脚本执行起来比较耗费时间,如果手机性能不够可能程序可能会崩溃,需要缩小搜索范围

2. 正向破解

因为这里有完整的算法,所以可以直接把算法扣出来写代码计算一下结果:

直接扣出来用Eclipse写java代码正向破解效率会更高,也不用担心程序崩溃的问题

package TestFlag002;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class TestFlag002 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for (int i = 100000; i < 1000000; i++) {
            if ("6574f28f75dddc488f3c7c21fddfa0cd16901206".equals(encode(Integer.toString(i)))) {
                System.out.println(i);
            }
        }
    }

    public static String encode(String decript) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(decript.getBytes());
            byte[] messageDigest = digest.digest();
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String shaHex = Integer.toHexString(b & 255);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
        }
    }
}

运行一秒钟就可以出结果,效率更高。

  • 标题: CTF002
  • 作者: xiaoeryu
  • 创建于 : 2023-07-09 14:48:43
  • 更新于 : 2023-07-09 14:57:56
  • 链接: https://github.com/xiaoeryu/2023/07/09/CTF002/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论