首页
社区
课程
招聘
52pojie2020春节红包-第三题(升级版)暴力破解
2020-2-19 15:02 8003

52pojie2020春节红包-第三题(升级版)暴力破解

2020-2-19 15:02
8003

52pojie的2020春节红包第三题:

下载地址

  • https://www.52pojie.cn/thread-1101355-1-1.html

分析特别多,静态动态都有

  • https://www.52pojie.cn/thread-1105016-1-1.html
  • https://www.52pojie.cn/thread-1105016-1-1.html

出题人有个纰漏

它是对结果进行倒推,在比较的时候给出结果的明文,导致直接hook就能拿结果;

这里看到一个题目,接近该题的升级版

题目见附件,比52pojie的题目稍微进步了一点,对输入进行操作,需要倒推输入的值,还有个SHA1,导致静态几乎解不了。

 

这里用frida的主动调用来爆破,直接跑出结果。

function main(){
    Java.perform(function x(){
        console.log("In Java Perform function")
        var ByteString = Java.use("com.android.okhttp.okio.ByteString");
        var verify = Java.use("org.teamsik.ahe17.qualification.Verifier")
        var stringClass = Java.use("java.lang.String")

        var p = stringClass.$new("09042ec2c2c08c4cbece042681caf1d13984f24a")
        var pSign = p.getBytes()
        console.log(ByteString.of(pSign).hex())

        for (var i = 999 ; i < 10000 ; i++) { 
            console.log("i="+i)
            var v = stringClass.$new(String(i))
            var vSign = verify.encodePassword(v)
            console.log(ByteString.of(vSign).hex())       
            if (ByteString.of(vSign).hex() == ByteString.of(pSign).hex()) { 
                console.log("i="+i)
                break; 
            }
        }

    })
};
setImmediate(main)


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-2-19 15:16 被roysue编辑 ,原因:
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (6)
雪    币: 10490
活跃值: (6589)
能力值: ( LV12,RANK:214 )
在线值:
发帖
回帖
粉丝
neilwu 1 2020-2-19 15:09
2
0
这个狠
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_xghoecki 2020-2-23 13:24
3
1
感谢分享
雪    币: 242
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
情韵 2020-2-25 08:06
4
0
感谢分享
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ChearMG 2020-2-26 17:40
5
0
直接hook verifyPassword方法为true不就行了么
最后于 2020-2-26 17:42 被ChearMG编辑 ,原因:
雪    币: 3907
活跃值: (5692)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
roysue 3 2020-2-26 17:52
6
0
ChearMG 直接hook&nbsp;verifyPassword方法为true不就行了么
那flag是多少呢?
雪    币: 649
活跃值: (26)
能力值: ( LV4,RANK:46 )
在线值:
发帖
回帖
粉丝
Deepinsky 2020-3-4 22:28
7
0

这题没有so文件,纯java可以解(可以不用frida,但师傅的frida脚本解法学到了~),主要是复制粘贴jadx-gui反编译Verifier方法,然后修改下传入值,就可以直接爆破(也只能是爆破)
本题对输入字符串进行了加盐操作(salt:主要是为了防止密码过短。本题分别在输入字符串各个位置加了几个字符),然后用sha1加密字符串在与"09042ec2c2c08c4cbece042681caf1d13984f24a"比较

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class MainActivity {
    public static boolean verifyPassword( String input) {//这里修改下传入值
        if (input.length() != 4) {
            return false;
        }
        byte[] v = encodePassword(input);
        byte[] p = "09042ec2c2c08c4cbece042681caf1d13984f24a".getBytes();
        if (v.length != p.length) {
            return false;
        }
        for (int i = 0; i < v.length; i++) {
            if (v[i] != p[i]) {
                return false;
            }
        }
        return true;
    }

    private static byte[] encodePassword(String input) {
        byte[] SALT = {95, 35, 83, 73, 75, 35, 95};
        try {
            StringBuilder sb = new StringBuilder();
            sb.append((char) SALT[0]);
            sb.append((char) SALT[1]);
            for (int i = 0; i < input.length(); i++) {
                sb.append((char) input.getBytes("iso-8859-1")[i]);
                sb.append((char) SALT[i + 2]);
            }
            sb.append((char) SALT[6]);
            byte[] bArr = new byte[0];
            return SHA1(sb.toString()).getBytes("iso-8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String convertToHex(byte[] data) {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) {
            int halfbyte = (data[i] >>> 4) & 15;
            int two_halfs = 0;
            while (true) {
                if (halfbyte < 0 || halfbyte > 9) {
                    buf.append((char) ((halfbyte - 10) + 97));
                } else {
                    buf.append((char) (halfbyte + 48));
                }
                halfbyte = data[i] & 15;
                int two_halfs2 = two_halfs + 1;
                if (two_halfs >= 1) {
                    break;
                }
                two_halfs = two_halfs2;
            }
        }
        return buf.toString();
    }

    private static String SHA1(String text) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] bArr = new byte[40];
            md.update(text.getBytes("iso-8859-1"), 0, text.length());
            return convertToHex(md.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e2) {
            e2.printStackTrace();
        }
        return null;

    }

//以上均为粘贴代码

     public static void main(String[] strArr) {
        int i;
        for(i = 999;i<10000; i++) {
            String sn = String.valueOf(i);
            if (verifyPassword(sn)){
                System.out.println("success:" + i);
                break;
            }
            else {
                System.out.println("fail:" + i);
            }
        }
        }
}

最后于 2020-3-4 22:40 被Deepinsky编辑 ,原因:
游客
登录 | 注册 方可回帖
返回