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

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

2020-2-19 15:02
9089

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

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

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

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

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-2-19 15:16 被roysue编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
赞赏记录
参与人
雪币
留言
时间
codeoooo
为你点赞~
2023-8-8 15:23
PLEBFE
为你点赞~
2023-1-18 04:56
最新回复 (6)
雪    币: 11459
活跃值: (7939)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
2
这个狠
2020-2-19 15:09
0
雪    币: 2510
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2020-2-23 13:24
1
雪    币: 242
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2020-2-25 08:06
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
直接hook verifyPassword方法为true不就行了么
最后于 2020-2-26 17:42 被ChearMG编辑 ,原因:
2020-2-26 17:40
0
雪    币: 3907
活跃值: (5827)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
6
ChearMG 直接hook verifyPassword方法为true不就行了么
那flag是多少呢?
2020-2-26 17:52
0
雪    币: 649
活跃值: (26)
能力值: ( LV4,RANK:46 )
在线值:
发帖
回帖
粉丝
7

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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编辑 ,原因:
2020-3-4 22:28
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册