首页
社区
课程
招聘
1
ctf2018-第8题
发表于: 2018-7-1 13:54 2820

ctf2018-第8题

2018-7-1 13:54
2820
进制转换36/62/64/256

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
struct buf {
    BYTE len0;
    BYTE len0_1; // len0_1 ==len0+4
    BYTE len1;
    BYTE len2;
    BYTE r0[len0+4];
    BYTE r1[len1];
    BYTE r2[len2];
};
 
.text:00401A19                 mov     al, [edx]
.text:00401A1B                 cmp     al, 1
.text:00401A1D                 jb      loc_4023E6
.text:00401A23                 cmp     al, 18h
.text:00401A25                 ja      loc_4023E6
.text:00401A2B                 mov     cl, [edx+1]
.text:00401A2E                 cmp     cl, 1
.text:00401A31                 mov     byte ptr [ebp+var_14], cl
.text:00401A34                 jb      loc_4023E6
.text:00401A3A                 cmp     cl, 18h
.text:00401A3D                 ja      loc_4023E6
.text:00401A43                 mov     bl, [edx+2]
.text:00401A46                 cmp     bl, 1
.text:00401A49                 jb      loc_4023E6
.text:00401A4F                 cmp     bl, 18h
.text:00401A52                 ja      loc_4023E6
.text:00401A58                 mov     cl, [edx+3]
.text:00401A5B                 cmp     cl, 1
.text:00401A5E                 jb      loc_4023E6
.text:00401A64                 cmp     cl, 18h
.text:00401A67                 ja      loc_4023E6
.text:00401A6D                 mov     esi, [ebp+var_14]
.text:00401A70                 and     eax, 0FFh
.text:00401A75                 and     esi, 0FFh
.text:00401A7B                 lea     edx, [eax+4]
.text:00401A7E                 cmp     edx, esi
.text:00401A80                 jnz     loc_4023E6
.text:00401A86                 and     ecx, 0FFh
.text:00401A8C                 and     ebx, 0FFh
.text:00401A92                 add     eax, ecx
.text:00401A94                 mov     ecx, [ebp+var_2C]
.text:00401A97                 mov     edx, [ecx+8]
.text:00401A9A                 lea     eax, [ebx+eax+8]
.text:00401A9E                 cmp     eax, edx
.text:00401AA0                 jnz     loc_4023E6

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
struct buf {
    BYTE len0;
    BYTE len0_1; // len0_1 ==len0+4
    BYTE len1;
    BYTE len2;
    BYTE r0[len0+4];
    BYTE r1[len1];
    BYTE r2[len2];
};
 
.text:00401A19                 mov     al, [edx]
.text:00401A1B                 cmp     al, 1
.text:00401A1D                 jb      loc_4023E6
.text:00401A23                 cmp     al, 18h
.text:00401A25                 ja      loc_4023E6
.text:00401A2B                 mov     cl, [edx+1]
.text:00401A2E                 cmp     cl, 1
.text:00401A31                 mov     byte ptr [ebp+var_14], cl
.text:00401A34                 jb      loc_4023E6
.text:00401A3A                 cmp     cl, 18h
.text:00401A3D                 ja      loc_4023E6
.text:00401A43                 mov     bl, [edx+2]
.text:00401A46                 cmp     bl, 1
.text:00401A49                 jb      loc_4023E6
.text:00401A4F                 cmp     bl, 18h
.text:00401A52                 ja      loc_4023E6
.text:00401A58                 mov     cl, [edx+3]
.text:00401A5B                 cmp     cl, 1
.text:00401A5E                 jb      loc_4023E6
.text:00401A64                 cmp     cl, 18h
.text:00401A67                 ja      loc_4023E6
.text:00401A6D                 mov     esi, [ebp+var_14]
.text:00401A70                 and     eax, 0FFh
.text:00401A75                 and     esi, 0FFh
.text:00401A7B                 lea     edx, [eax+4]
.text:00401A7E                 cmp     edx, esi
.text:00401A80                 jnz     loc_4023E6
.text:00401A86                 and     ecx, 0FFh
.text:00401A8C                 and     ebx, 0FFh
.text:00401A92                 add     eax, ecx
.text:00401A94                 mov     ecx, [ebp+var_2C]
.text:00401A97                 mov     edx, [ecx+8]
.text:00401A9A                 lea     eax, [ebx+eax+8]
.text:00401A9E                 cmp     eax, edx
.text:00401AA0                 jnz     loc_4023E6

v1=g_bn1, v2=g_bn2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.text:00401D21                 push    offset aWelcomeToBbsPe ; "welcome to bbs.pediy.com."
.text:00401D26                 push    offset g_bn1
.text:00401D2B                 call    x_from_basen
.text:00401D30                 mov     edi, offset a0123456789abcd_0 ; 
.text:00401D35                 or      ecx, 0FFFFFFFFh
.text:00401D38                 xor     eax, eax
.text:00401D3A                 push    2Bh
.text:00401D3C                 repne scasb
.text:00401D3E                 not     ecx
.text:00401D40                 push    2Dh
.text:00401D42                 dec     ecx
.text:00401D43                 push    offset a0123456789abcd_0 ; 
.text:00401D48                 push    ecx
.text:00401D49                 mov     edi, offset aAuthorByLookhc ; "Author by Lookhc"
.text:00401D4E                 or      ecx, 0FFFFFFFFh
.text:00401D51                 repne scasb
.text:00401D53                 not     ecx
.text:00401D55                 dec     ecx
.text:00401D56                 push    ecx
.text:00401D57                 push    offset aAuthorByLookhc ; "Author by Lookhc"
.text:00401D5C                 push    offset g_bn2
.text:00401D61                 call    x_from_basen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
.text:00401D21                 push    offset aWelcomeToBbsPe ; "welcome to bbs.pediy.com."
.text:00401D26                 push    offset g_bn1
.text:00401D2B                 call    x_from_basen
.text:00401D30                 mov     edi, offset a0123456789abcd_0 ; 
.text:00401D35                 or      ecx, 0FFFFFFFFh
.text:00401D38                 xor     eax, eax
.text:00401D3A                 push    2Bh
.text:00401D3C                 repne scasb
.text:00401D3E                 not     ecx
.text:00401D40                 push    2Dh
.text:00401D42                 dec     ecx
.text:00401D43                 push    offset a0123456789abcd_0 ; 
.text:00401D48                 push    ecx
.text:00401D49                 mov     edi, offset aAuthorByLookhc ; "Author by Lookhc"
.text:00401D4E                 or      ecx, 0FFFFFFFFh
.text:00401D51                 repne scasb
.text:00401D53                 not     ecx
.text:00401D55                 dec     ecx
.text:00401D56                 push    ecx
.text:00401D57                 push    offset aAuthorByLookhc ; "Author by Lookhc"
.text:00401D5C                 push    offset g_bn2
.text:00401D61                 call    x_from_basen

校验r0[len0]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.text:00401DEB                 mov     edx, [ebp+var_38]
.text:00401DEE                 lea     eax, [ebp+var_44] ; must return 1
.text:00401DF1                 lea     ecx, [ebp+var_3C] ; must return 0
.text:00401DF4                 push    eax
.text:00401DF5                 push    ecx
.text:00401DF6                 mov     edi, edx
.text:00401DF8                 or      ecx, 0FFFFFFFFh
.text:00401DFB                 xor     eax, eax
.text:00401DFD                 mov     [ebp+var_3C], 64h
.text:00401E04                 mov     [ebp+var_44], 0
.text:00401E0B                 repne scasb
.text:00401E0D                 not     ecx
.text:00401E0F                 dec     ecx
.text:00401E10                 push    5
.text:00401E12                 push    ecx
.text:00401E13                 push    edx
.text:00401E14                 call    sub_4010A0      ; must return 1

校验buf的crc
1
2
3
4
5
6
7
8
9
.text:00401E29                 push    ecx
.text:00401E2A                 push    edx
.text:00401E2B                 push    offset loc_401ABF
.text:00401E30                 push    6780h
.text:00401E35                 push    13114F0Dh
.text:00401E3A                 push    1F6E1EA0h
.text:00401E3F                 call    sub_404A60      ; crc32(buf, 0) == 0
.text:00401E44                 add     esp, 1Ch
.text:00401E47                 mov     [ebp+lpMem], eax ; must be 0

这个循环会校验 r0^n == r1^n+r2^n (n: 3~9), 这个肯定不成立
1
2
3
4
5
6
7
8
.text:00401EF2                 cmp     eax, 0Ah
.text:00401EF5                 jge     loc_40210F
.text:00401EFB                 test    eax, eax
.text:00401EFD                 jnz     short loc_401F30
...
.text:004020FF                 call    bn_compare
.text:00402104                 test    eax, eax
.text:00402106                 jnz     loc_4022E9      ; always jmp

异常处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.text:004022E9                 mov     eax, [ebp+var_3C] ; must be 0
.text:004022EC                 test    eax, eax
.text:004022EE                 jnz     short loc_402305
.text:004022F0                 lea     eax, [ebp+var_48]
.text:004022F3                 push    offset __TI1H   ; throw info for 'int'
.text:004022F8                 push    eax
.text:004022F9                 mov     [ebp+var_48], 1
.text:00402300                 call    __CxxThrowException@8 ; _CxxThrowException(x,x)
 
.text:00402367 ;   catch(...) // owned by 401EE8
.text:00402367                 mov     dword ptr [ebp-30h], 2
.text:0040236E                 mov     eax, offset loc_40211C
.text:00402373                 retn
 
.text:0040211C                 mov     eax, [ebp-30h]
.text:0040211F                 mov     [ebp+var_4], 0FFFFFFFFh
.text:00402126                 cmp     eax, 2
.text:00402129                 jnz     loc_402399

r1-r2=bn2
2*r1+4*r2=bn1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:00402189                 call    bn_add
...
.text:004021BB                 call    bn_compare
 
.text:004021CE                 push    4
.text:004021D0                 push    edx
.text:004021D1                 call    bn_int
...
.text:004021F5                 call    bn_mul
.text:004021FA                 lea     ecx, [ebp+var_1970]
.text:00402200                 push    2
.text:00402202                 push    ecx
.text:00402203                 call    bn_int
...
.text:00402226                 call    bn_mul
.text:0040222B                 mov     ecx, 84h
.text:00402230                 mov     esi, offset g_bn1
...
.text:0040225F                 call    bn_add
...
.text:0040228D                 call    bn_rebase

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
crc32_table = [
    0x00000000L0x77073096L0xee0e612cL0x990951baL0x076dc419L0x706af48fL0xe963a535L0x9e6495a3L,
    0x0edb8832L0x79dcb8a4L0xe0d5e91eL0x97d2d988L0x09b64c2bL0x7eb17cbdL0xe7b82d07L0x90bf1d91L,
    0x1db71064L0x6ab020f2L0xf3b97148L0x84be41deL0x1adad47dL0x6ddde4ebL0xf4d4b551L0x83d385c7L,
    0x136c9856L0x646ba8c0L0xfd62f97aL0x8a65c9ecL0x14015c4fL0x63066cd9L0xfa0f3d63L0x8d080df5L,
    0x3b6e20c8L0x4c69105eL0xd56041e4L0xa2677172L0x3c03e4d1L0x4b04d447L0xd20d85fdL0xa50ab56bL,
    0x35b5a8faL0x42b2986cL0xdbbbc9d6L0xacbcf940L0x32d86ce3L0x45df5c75L0xdcd60dcfL0xabd13d59L,
    0x26d930acL0x51de003aL0xc8d75180L0xbfd06116L0x21b4f4b5L0x56b3c423L0xcfba9599L0xb8bda50fL,
    0x2802b89eL0x5f058808L0xc60cd9b2L0xb10be924L0x2f6f7c87L0x58684c11L0xc1611dabL0xb6662d3dL,
    0x76dc4190L0x01db7106L0x98d220bcL0xefd5102aL0x71b18589L0x06b6b51fL0x9fbfe4a5L0xe8b8d433L,
    0x7807c9a2L0x0f00f934L0x9609a88eL0xe10e9818L0x7f6a0dbbL0x086d3d2dL0x91646c97L0xe6635c01L,
    0x6b6b51f4L0x1c6c6162L0x856530d8L0xf262004eL0x6c0695edL0x1b01a57bL0x8208f4c1L0xf50fc457L,
    0x65b0d9c6L0x12b7e950L0x8bbeb8eaL0xfcb9887cL0x62dd1ddfL0x15da2d49L0x8cd37cf3L0xfbd44c65L,
    0x4db26158L0x3ab551ceL0xa3bc0074L0xd4bb30e2L0x4adfa541L0x3dd895d7L0xa4d1c46dL0xd3d6f4fbL,
    0x4369e96aL0x346ed9fcL0xad678846L0xda60b8d0L0x44042d73L0x33031de5L0xaa0a4c5fL0xdd0d7cc9L,
    0x5005713cL0x270241aaL0xbe0b1010L0xc90c2086L0x5768b525L0x206f85b3L0xb966d409L0xce61e49fL,
    0x5edef90eL0x29d9c998L0xb0d09822L0xc7d7a8b4L0x59b33d17L0x2eb40d81L0xb7bd5c3bL0xc0ba6cadL,
    0xedb88320L0x9abfb3b6L0x03b6e20cL0x74b1d29aL0xead54739L0x9dd277afL0x04db2615L0x73dc1683L,
    0xe3630b12L0x94643b84L0x0d6d6a3eL0x7a6a5aa8L0xe40ecf0bL0x9309ff9dL0x0a00ae27L0x7d079eb1L,
    0xf00f9344L0x8708a3d2L0x1e01f268L0x6906c2feL0xf762575dL0x806567cbL0x196c3671L0x6e6b06e7L,
    0xfed41b76L0x89d32be0L0x10da7a5aL0x67dd4accL0xf9b9df6fL0x8ebeeff9L0x17b7be43L0x60b08ed5L,
    0xd6d6a3e8L0xa1d1937eL0x38d8c2c4L0x4fdff252L0xd1bb67f1L0xa6bc5767L0x3fb506ddL0x48b2364bL,
    0xd80d2bdaL0xaf0a1b4cL0x36034af6L0x41047a60L0xdf60efc3L0xa867df55L0x316e8eefL0x4669be79L,
    0xcb61b38cL0xbc66831aL0x256fd2a0L0x5268e236L0xcc0c7795L0xbb0b4703L0x220216b9L0x5505262fL,
    0xc5ba3bbeL0xb2bd0b28L0x2bb45a92L0x5cb36a04L0xc2d7ffa7L0xb5d0cf31L0x2cd99e8bL0x5bdeae1dL,
    0x9b64c2b0L0xec63f226L0x756aa39cL0x026d930aL0x9c0906a9L0xeb0e363fL0x72076785L0x05005713L,
    0x95bf4a82L0xe2b87a14L0x7bb12baeL0x0cb61b38L0x92d28e9bL0xe5d5be0dL0x7cdcefb7L0x0bdbdf21L,
    0x86d3d2d4L0xf1d4e242L0x68ddb3f8L0x1fda836eL0x81be16cdL0xf6b9265bL0x6fb077e1L0x18b74777L,
    0x88085ae6L0xff0f6a70L0x66063bcaL0x11010b5cL0x8f659effL0xf862ae69L0x616bffd3L0x166ccf45L,
    0xa00ae278L0xd70dd2eeL0x4e048354L0x3903b3c2L0xa7672661L0xd06016f7L0x4969474dL0x3e6e77dbL,
    0xaed16a4aL0xd9d65adcL0x40df0b66L0x37d83bf0L0xa9bcae53L0xdebb9ec5L0x47b2cf7fL0x30b5ffe9L,
    0xbdbdf21cL0xcabac28aL0x53b39330L0x24b4a3a6L0xbad03605L0xcdd70693L0x54de5729L0x23d967bfL,
    0xb3667a2eL0xc4614ab8L0x5d681b02L0x2a6f2b94L0xb40bbe37L0xc30c8ea1L0x5a05df1bL0x2d02ef8dL
]
 
crc32_table_highest_byte_map = [-1* 256
for in range(256):
    crc32_table_highest_byte_map[(crc32_table[i] >> 24) & 0xFF= i
 
 
def array_to_int(k, base):
    = 0
    = 1
    for in k:
        += * _
        *= base
    return v
 
 
def int_to_array(v, base):
    = []
    while v != 0:
        r.append(v % base)
        = / base
    return r
 
 
def str_to_int(s, char_map):  # type:(str,str) -> int
    = []
    for in s:
        r.append(char_map.find(_))
    return array_to_int(r, len(char_map))
 
 
def int_to_str(v, char_map):  # type:(int,str) -> str
 
    = int_to_array(v, len(char_map))
    = ''
    for in r:
        = char_map[_] + s
    return s
 
 
def print_array(r):
    = ''
    for in r:
        += ('%x' % _).zfill(2+ ' '
    print s
    return
 
 
def print_int(v, base):
    = int_to_array(v, base)
    print_array(r)
    return
 
 
def array_to_str(k):
    = ''
    for in k:
        += chr(_)
    return s
 
 
def str_to_array(s):
    = []
    for in s:
        k.append(ord(s))
    return k
 
 
def crc32_update(k, crc):
    for in k:
        crc = (crc >> 8) ^ crc32_table[b ^ (crc & 0xFF)]
    return crc
 
 
def get_crc32_update_init_value(k, crc):
    = len(k) - 1
    while z >= 0:
        idx = crc32_table_highest_byte_map[(crc >> 24) & 0xFF]
        crc = ((crc32_table[idx] ^ crc) << 8) | (idx ^ k[z])
        -= 1
    return crc
 
 
def crc32(k, crc_init=0):
    crc = crc_init
    crc = (~crc) & 0xFFFFFFFF
    crc = crc32_update(k, crc)
    crc = (~crc) & 0xFFFFFFFF
    return crc
 
 
def crc_RF(x):
    return crc32_table_highest_byte_map[x]
 
 
def crc_F(x):
    return (crc32_table[x] >> 24) & 0xFF
 
 
def crc_G(x):
    return (crc32_table[x] >> 16) & 0xFF
 
 
def crc_H(x):
    return (crc32_table[x] >> 8) & 0xFF
 
 
def crc_I(x):
    return (crc32_table[x] >> 0) & 0xFF
 
 
def crack_crc(s_head, s_tail, crc_init, crc_final):
    crc1 = (~crc_init) & 0xFFFFFFFF
    crc1 = crc32_update(s_head, crc1)
    crc2 = (~crc_final) & 0xFFFFFFFF
    crc2 = get_crc32_update_init_value(s_tail, crc2)
 
    # hxxps://bbs.pediy.com/thread-8699.htm
    = (crc2 >> 24) & 0xFF
    = (crc2 >> 16) & 0xFF
    = (crc2 >> 8) & 0xFF
    = (crc2 >> 0) & 0xFF
 
    = (crc1 >> 24) & 0xFF
    = (crc1 >> 16) & 0xFF
    = (crc1 >> 8) & 0xFF
    = (crc1 >> 0) & 0xFF
 
    = crc_RF(W)
    = crc_RF(X ^ crc_G(p))
    = crc_RF(Y ^ crc_G(o) ^ crc_H(p))
    = crc_RF(Z ^ crc_G(n) ^ crc_H(o) ^ crc_I(p))
 
    = m ^ D
    = n ^ C ^ crc_I(m)
    = o ^ B ^ crc_H(m) ^ crc_I(n)
    = p ^ A ^ crc_G(m) ^ crc_H(n) ^ crc_I(o)
    return [d, c, b, a]
 
 
def check_crc_table():
    print('xxstart')
    k3 = [0* 256
    k2 = [0* 256
    k1 = [0* 256
    k0 = [0* 256
    for in range(256):
        k3[(crc32_table[_] >> 24) & 0xFF+= 1
        k2[(crc32_table[_] >> 16) & 0xFF+= 1
        k1[(crc32_table[_] >> 8) & 0xFF+= 1
        k0[(crc32_table[_] >> 0) & 0xFF+= 1
    for in range(256):
        if k3[_] != 1:
            print('k3[%s]=%s' % (_, k3[_]))
        # if k2[_] != 1:
        #     print('k2[%s]=%s' % (_, k2[_]))
        # if k1[_] != 1:
        #     print('k1[%s]=%s' % (_, k1[_]))
        # if k0[_] != 1:
        #     print('k0[%s]=%s' % (_, k0[_]))
    print('xxend')
    return
 
 
def x_401080(v):
    if == 0:
        return 0
    = 1
    while (v & 1== 0:
        v >>= 1
        *= 2
        if == 0:
            return 0
    return r
 
 
def x_4010A0(buf, bits):
    a1 = 0
    buf_len = (1 << bits) - 1
    v_cnt0 = buf_len
    v_cnt1 = 0
    v_cnt2 = 0
 
    = 0
    for in range(buf_len):
        = buf[_]
        v_cnt0_v = x_401080(v_cnt0)
        v_cnt1_v = x_401080(v_cnt1)
        v_cnt2_v = x_401080(v_cnt2)
        _v_cnt0_v = v_cnt0_v if v_cnt0_v != 0 else 100
        _v_cnt1_v = v_cnt1_v if v_cnt1_v != 0 else 100
        _v_cnt2_v = v_cnt2_v if v_cnt2_v != 0 else 100
        if == 0:
            if _v_cnt0_v >= _v_cnt1_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt1 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 1:
            if _v_cnt0_v >= _v_cnt2_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt2 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 2:
            if _v_cnt1_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt1_v
            v_cnt1 -= v_cnt1_v
            a1 = v_cnt1_v
        elif == 3:
            if _v_cnt1_v >= _v_cnt2_v:
                break
            v_cnt1 -= v_cnt1_v
            v_cnt2 += v_cnt1_v
            a1 = v_cnt1_v
        elif == 4:
            if _v_cnt2_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
        elif == 5:
            if _v_cnt2_v >= _v_cnt1_v:
                break
            v_cnt1 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
    = False
    a0 = v_cnt0
    if == (buf_len - 1and a0 == 0 and a1 == 1:
        = True
    return [r, a0, a1]
 
 
def x_crack_part1_raw(buf, offset, cond0, cond1, vct_max, strict=False):
    bits = 5
    # buf[(1 << bits) - 1] == 0
    i7_end = 6 if (offset != 0x18else 1
 
    vct = []
    for i0 in range(6):
        for i1 in range(6):
            for i2 in range(6):
                for i3 in range(6):
                    for i4 in range(6):
                        for i5 in range(6):
                            for i6 in range(6):
                                for i7 in range(i7_end):
                                    buf[offset + 0= i0
                                    buf[offset + 1= i1
                                    buf[offset + 2= i2
                                    buf[offset + 3= i3
                                    buf[offset + 4= i4
                                    buf[offset + 5= i5
                                    buf[offset + 6= i6
                                    buf[offset + 7= i7
                                    r, a_0, a_1 = x_4010A0(buf, bits)
                                    if strict:
                                        ok = r
                                    else:
                                        ok = a_0 <= cond0 and (cond1 < 0 or a_1 <= cond1)
                                    if ok:
                                        = [i0, i1, i2, i3, i4, i5, i6, i7]
                                        if strict:
                                            print('(%s): %s' % (len(vct), v))
                                        vct.append(v)
                                        if (vct_max > 0and (len(vct) >= vct_max):
                                            return vct
 
    return vct
 
 
def x_crack_part1(count, use_cache=True):
    buf = [0* 32
 
    print('crack_part1 0:8')
    offset = 0
    if use_cache:
        vct0 = [[01304501], ]
    else:
        vct0 = x_crack_part1_raw(buf, offset, 0x10-11)
    print vct0
    for in range(8):
        buf[offset + _] = vct0[0][_]
 
    print('crack_part1 8:0x10')
    offset += 8
    if use_cache:
        vct1 = [[21243013], ]
    else:
        vct1 = x_crack_part1_raw(buf, offset, 0x0F-11)
    print vct1
    for in range(8):
        buf[offset + _] = vct1[0][_]
 
    print('crack_part1 0x10:0x18')
    offset += 8
    if use_cache:
        vct2 = [[02020204], ]
    else:
        vct2 = x_crack_part1_raw(buf, offset, 011)
    print vct2
    for in range(8):
        buf[offset + _] = vct2[0][_]
 
    print('crack_part1 0x18:0x20')
    offset += 8
    vct3 = x_crack_part1_raw(buf, offset, 01, count, strict=True)
 
    = []
    for in range(len(vct3)):
        = [_ for in buf]
        for in range(8):
            v[offset + b] = vct3[a][b]
        # print_array(v)
        r.append(v)
    return r
 
 
def x_gen_sn(k):
    # char_map36 = 'abcdefghijklmnopqrstuvwxyz0123456789'
    char_map62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    char_map64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. '
    r0_0 = []
    for in range(0len(k), 2):
        r0_0 = [k[_ + 1* 6 + k[_], ] + r0_0
    = array_to_int(r0_0, 36)
    # print_int(v, 36)
    # print int_to_str(v, char_map36)
    r0_0 = int_to_array(v, 256)
 
    r0_1 = [-1* 4
    r0 = r0_0 + r0_1
 
    v1 = str_to_int('welcome to bbs.pediy.com.'[::-1], char_map64)
    v2 = str_to_int('Author by Lookhc'[::-1], char_map64)
    = (v1 - v2 * 2/ 6
    = + v2
    r1 = int_to_array(x, 256)
    r2 = int_to_array(y, 256)
 
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    r0_1 = crack_crc(k[0:len(r0)], k[4 + len(r0):], 00)
    r0 = r0_0 + r0_1
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    print int_to_str(array_to_int(k, 256), char_map62)
    return
 
 
def test():
    # count = 256
    count = 2
    ks = x_crack_part1(count, use_cache=True)
    for in range(len(ks)):
        x_gen_sn(ks[_])
 
    return
 
 
test()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.text:00401DEB                 mov     edx, [ebp+var_38]
.text:00401DEE                 lea     eax, [ebp+var_44] ; must return 1
.text:00401DF1                 lea     ecx, [ebp+var_3C] ; must return 0
.text:00401DF4                 push    eax
.text:00401DF5                 push    ecx
.text:00401DF6                 mov     edi, edx
.text:00401DF8                 or      ecx, 0FFFFFFFFh
.text:00401DFB                 xor     eax, eax
.text:00401DFD                 mov     [ebp+var_3C], 64h
.text:00401E04                 mov     [ebp+var_44], 0
.text:00401E0B                 repne scasb
.text:00401E0D                 not     ecx
.text:00401E0F                 dec     ecx
.text:00401E10                 push    5
.text:00401E12                 push    ecx
.text:00401E13                 push    edx
.text:00401E14                 call    sub_4010A0      ; must return 1

校验buf的crc
1
2
3
4
5
6
7
8
9
.text:00401E29                 push    ecx
.text:00401E2A                 push    edx
.text:00401E2B                 push    offset loc_401ABF
.text:00401E30                 push    6780h
.text:00401E35                 push    13114F0Dh
.text:00401E3A                 push    1F6E1EA0h
.text:00401E3F                 call    sub_404A60      ; crc32(buf, 0) == 0
.text:00401E44                 add     esp, 1Ch
.text:00401E47                 mov     [ebp+lpMem], eax ; must be 0

1
2
3
4
5
6
7
8
9
.text:00401E29                 push    ecx
.text:00401E2A                 push    edx
.text:00401E2B                 push    offset loc_401ABF
.text:00401E30                 push    6780h
.text:00401E35                 push    13114F0Dh
.text:00401E3A                 push    1F6E1EA0h
.text:00401E3F                 call    sub_404A60      ; crc32(buf, 0) == 0
.text:00401E44                 add     esp, 1Ch
.text:00401E47                 mov     [ebp+lpMem], eax ; must be 0

这个循环会校验 r0^n == r1^n+r2^n (n: 3~9), 这个肯定不成立
1
2
3
4
5
6
7
8
.text:00401EF2                 cmp     eax, 0Ah
.text:00401EF5                 jge     loc_40210F
.text:00401EFB                 test    eax, eax
.text:00401EFD                 jnz     short loc_401F30
...
.text:004020FF                 call    bn_compare
.text:00402104                 test    eax, eax
.text:00402106                 jnz     loc_4022E9      ; always jmp

异常处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.text:004022E9                 mov     eax, [ebp+var_3C] ; must be 0
.text:004022EC                 test    eax, eax
.text:004022EE                 jnz     short loc_402305
.text:004022F0                 lea     eax, [ebp+var_48]
.text:004022F3                 push    offset __TI1H   ; throw info for 'int'
.text:004022F8                 push    eax
.text:004022F9                 mov     [ebp+var_48], 1
.text:00402300                 call    __CxxThrowException@8 ; _CxxThrowException(x,x)
 
.text:00402367 ;   catch(...) // owned by 401EE8
.text:00402367                 mov     dword ptr [ebp-30h], 2
.text:0040236E                 mov     eax, offset loc_40211C
.text:00402373                 retn
 
.text:0040211C                 mov     eax, [ebp-30h]
.text:0040211F                 mov     [ebp+var_4], 0FFFFFFFFh
.text:00402126                 cmp     eax, 2
.text:00402129                 jnz     loc_402399

r1-r2=bn2
2*r1+4*r2=bn1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:00402189                 call    bn_add
...
.text:004021BB                 call    bn_compare
 
.text:004021CE                 push    4
.text:004021D0                 push    edx
.text:004021D1                 call    bn_int
...
.text:004021F5                 call    bn_mul
.text:004021FA                 lea     ecx, [ebp+var_1970]
.text:00402200                 push    2
.text:00402202                 push    ecx
.text:00402203                 call    bn_int
...
.text:00402226                 call    bn_mul
.text:0040222B                 mov     ecx, 84h
.text:00402230                 mov     esi, offset g_bn1
...
.text:0040225F                 call    bn_add
...
.text:0040228D                 call    bn_rebase

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
crc32_table = [
    0x00000000L0x77073096L0xee0e612cL0x990951baL0x076dc419L0x706af48fL0xe963a535L0x9e6495a3L,
    0x0edb8832L0x79dcb8a4L0xe0d5e91eL0x97d2d988L0x09b64c2bL0x7eb17cbdL0xe7b82d07L0x90bf1d91L,
    0x1db71064L0x6ab020f2L0xf3b97148L0x84be41deL0x1adad47dL0x6ddde4ebL0xf4d4b551L0x83d385c7L,
    0x136c9856L0x646ba8c0L0xfd62f97aL0x8a65c9ecL0x14015c4fL0x63066cd9L0xfa0f3d63L0x8d080df5L,
    0x3b6e20c8L0x4c69105eL0xd56041e4L0xa2677172L0x3c03e4d1L0x4b04d447L0xd20d85fdL0xa50ab56bL,
    0x35b5a8faL0x42b2986cL0xdbbbc9d6L0xacbcf940L0x32d86ce3L0x45df5c75L0xdcd60dcfL0xabd13d59L,
    0x26d930acL0x51de003aL0xc8d75180L0xbfd06116L0x21b4f4b5L0x56b3c423L0xcfba9599L0xb8bda50fL,
    0x2802b89eL0x5f058808L0xc60cd9b2L0xb10be924L0x2f6f7c87L0x58684c11L0xc1611dabL0xb6662d3dL,
    0x76dc4190L0x01db7106L0x98d220bcL0xefd5102aL0x71b18589L0x06b6b51fL0x9fbfe4a5L0xe8b8d433L,
    0x7807c9a2L0x0f00f934L0x9609a88eL0xe10e9818L0x7f6a0dbbL0x086d3d2dL0x91646c97L0xe6635c01L,
    0x6b6b51f4L0x1c6c6162L0x856530d8L0xf262004eL0x6c0695edL0x1b01a57bL0x8208f4c1L0xf50fc457L,
    0x65b0d9c6L0x12b7e950L0x8bbeb8eaL0xfcb9887cL0x62dd1ddfL0x15da2d49L0x8cd37cf3L0xfbd44c65L,
    0x4db26158L0x3ab551ceL0xa3bc0074L0xd4bb30e2L0x4adfa541L0x3dd895d7L0xa4d1c46dL0xd3d6f4fbL,
    0x4369e96aL0x346ed9fcL0xad678846L0xda60b8d0L0x44042d73L0x33031de5L0xaa0a4c5fL0xdd0d7cc9L,
    0x5005713cL0x270241aaL0xbe0b1010L0xc90c2086L0x5768b525L0x206f85b3L0xb966d409L0xce61e49fL,
    0x5edef90eL0x29d9c998L0xb0d09822L0xc7d7a8b4L0x59b33d17L0x2eb40d81L0xb7bd5c3bL0xc0ba6cadL,
    0xedb88320L0x9abfb3b6L0x03b6e20cL0x74b1d29aL0xead54739L0x9dd277afL0x04db2615L0x73dc1683L,
    0xe3630b12L0x94643b84L0x0d6d6a3eL0x7a6a5aa8L0xe40ecf0bL0x9309ff9dL0x0a00ae27L0x7d079eb1L,
    0xf00f9344L0x8708a3d2L0x1e01f268L0x6906c2feL0xf762575dL0x806567cbL0x196c3671L0x6e6b06e7L,
    0xfed41b76L0x89d32be0L0x10da7a5aL0x67dd4accL0xf9b9df6fL0x8ebeeff9L0x17b7be43L0x60b08ed5L,
    0xd6d6a3e8L0xa1d1937eL0x38d8c2c4L0x4fdff252L0xd1bb67f1L0xa6bc5767L0x3fb506ddL0x48b2364bL,
    0xd80d2bdaL0xaf0a1b4cL0x36034af6L0x41047a60L0xdf60efc3L0xa867df55L0x316e8eefL0x4669be79L,
    0xcb61b38cL0xbc66831aL0x256fd2a0L0x5268e236L0xcc0c7795L0xbb0b4703L0x220216b9L0x5505262fL,
    0xc5ba3bbeL0xb2bd0b28L0x2bb45a92L0x5cb36a04L0xc2d7ffa7L0xb5d0cf31L0x2cd99e8bL0x5bdeae1dL,
    0x9b64c2b0L0xec63f226L0x756aa39cL0x026d930aL0x9c0906a9L0xeb0e363fL0x72076785L0x05005713L,
    0x95bf4a82L0xe2b87a14L0x7bb12baeL0x0cb61b38L0x92d28e9bL0xe5d5be0dL0x7cdcefb7L0x0bdbdf21L,
    0x86d3d2d4L0xf1d4e242L0x68ddb3f8L0x1fda836eL0x81be16cdL0xf6b9265bL0x6fb077e1L0x18b74777L,
    0x88085ae6L0xff0f6a70L0x66063bcaL0x11010b5cL0x8f659effL0xf862ae69L0x616bffd3L0x166ccf45L,
    0xa00ae278L0xd70dd2eeL0x4e048354L0x3903b3c2L0xa7672661L0xd06016f7L0x4969474dL0x3e6e77dbL,
    0xaed16a4aL0xd9d65adcL0x40df0b66L0x37d83bf0L0xa9bcae53L0xdebb9ec5L0x47b2cf7fL0x30b5ffe9L,
    0xbdbdf21cL0xcabac28aL0x53b39330L0x24b4a3a6L0xbad03605L0xcdd70693L0x54de5729L0x23d967bfL,
    0xb3667a2eL0xc4614ab8L0x5d681b02L0x2a6f2b94L0xb40bbe37L0xc30c8ea1L0x5a05df1bL0x2d02ef8dL
]
 
crc32_table_highest_byte_map = [-1* 256
for in range(256):
    crc32_table_highest_byte_map[(crc32_table[i] >> 24) & 0xFF= i
 
 
def array_to_int(k, base):
    = 0
    = 1
    for in k:
        += * _
        *= base
    return v
 
 
def int_to_array(v, base):
    = []
    while v != 0:
        r.append(v % base)
        = / base
    return r
 
 
def str_to_int(s, char_map):  # type:(str,str) -> int
    = []
    for in s:
        r.append(char_map.find(_))
    return array_to_int(r, len(char_map))
 
 
def int_to_str(v, char_map):  # type:(int,str) -> str
 
    = int_to_array(v, len(char_map))
    = ''
    for in r:
        = char_map[_] + s
    return s
 
 
def print_array(r):
    = ''
    for in r:
        += ('%x' % _).zfill(2+ ' '
    print s
    return
 
 
def print_int(v, base):
    = int_to_array(v, base)
    print_array(r)
    return
 
 
def array_to_str(k):
    = ''
    for in k:
        += chr(_)
    return s
 
 
def str_to_array(s):
    = []
    for in s:
        k.append(ord(s))
    return k
 
 
def crc32_update(k, crc):
    for in k:
        crc = (crc >> 8) ^ crc32_table[b ^ (crc & 0xFF)]
    return crc
 
 
def get_crc32_update_init_value(k, crc):
    = len(k) - 1
    while z >= 0:
        idx = crc32_table_highest_byte_map[(crc >> 24) & 0xFF]
        crc = ((crc32_table[idx] ^ crc) << 8) | (idx ^ k[z])
        -= 1
    return crc
 
 
def crc32(k, crc_init=0):
    crc = crc_init
    crc = (~crc) & 0xFFFFFFFF
    crc = crc32_update(k, crc)
    crc = (~crc) & 0xFFFFFFFF
    return crc
 
 
def crc_RF(x):
    return crc32_table_highest_byte_map[x]
 
 
def crc_F(x):
    return (crc32_table[x] >> 24) & 0xFF
 
 
def crc_G(x):
    return (crc32_table[x] >> 16) & 0xFF
 
 
def crc_H(x):
    return (crc32_table[x] >> 8) & 0xFF
 
 
def crc_I(x):
    return (crc32_table[x] >> 0) & 0xFF
 
 
def crack_crc(s_head, s_tail, crc_init, crc_final):
    crc1 = (~crc_init) & 0xFFFFFFFF
    crc1 = crc32_update(s_head, crc1)
    crc2 = (~crc_final) & 0xFFFFFFFF
    crc2 = get_crc32_update_init_value(s_tail, crc2)
 
    # hxxps://bbs.pediy.com/thread-8699.htm
    = (crc2 >> 24) & 0xFF
    = (crc2 >> 16) & 0xFF
    = (crc2 >> 8) & 0xFF
    = (crc2 >> 0) & 0xFF
 
    = (crc1 >> 24) & 0xFF
    = (crc1 >> 16) & 0xFF
    = (crc1 >> 8) & 0xFF
    = (crc1 >> 0) & 0xFF
 
    = crc_RF(W)
    = crc_RF(X ^ crc_G(p))
    = crc_RF(Y ^ crc_G(o) ^ crc_H(p))
    = crc_RF(Z ^ crc_G(n) ^ crc_H(o) ^ crc_I(p))
 
    = m ^ D
    = n ^ C ^ crc_I(m)
    = o ^ B ^ crc_H(m) ^ crc_I(n)
    = p ^ A ^ crc_G(m) ^ crc_H(n) ^ crc_I(o)
    return [d, c, b, a]
 
 
def check_crc_table():
    print('xxstart')
    k3 = [0* 256
    k2 = [0* 256
    k1 = [0* 256
    k0 = [0* 256
    for in range(256):
        k3[(crc32_table[_] >> 24) & 0xFF+= 1
        k2[(crc32_table[_] >> 16) & 0xFF+= 1
        k1[(crc32_table[_] >> 8) & 0xFF+= 1
        k0[(crc32_table[_] >> 0) & 0xFF+= 1
    for in range(256):
        if k3[_] != 1:
            print('k3[%s]=%s' % (_, k3[_]))
        # if k2[_] != 1:
        #     print('k2[%s]=%s' % (_, k2[_]))
        # if k1[_] != 1:
        #     print('k1[%s]=%s' % (_, k1[_]))
        # if k0[_] != 1:
        #     print('k0[%s]=%s' % (_, k0[_]))
    print('xxend')
    return
 
 
def x_401080(v):
    if == 0:
        return 0
    = 1
    while (v & 1== 0:
        v >>= 1
        *= 2
        if == 0:
            return 0
    return r
 
 
def x_4010A0(buf, bits):
    a1 = 0
    buf_len = (1 << bits) - 1
    v_cnt0 = buf_len
    v_cnt1 = 0
    v_cnt2 = 0
 
    = 0
    for in range(buf_len):
        = buf[_]
        v_cnt0_v = x_401080(v_cnt0)
        v_cnt1_v = x_401080(v_cnt1)
        v_cnt2_v = x_401080(v_cnt2)
        _v_cnt0_v = v_cnt0_v if v_cnt0_v != 0 else 100
        _v_cnt1_v = v_cnt1_v if v_cnt1_v != 0 else 100
        _v_cnt2_v = v_cnt2_v if v_cnt2_v != 0 else 100
        if == 0:
            if _v_cnt0_v >= _v_cnt1_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt1 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 1:
            if _v_cnt0_v >= _v_cnt2_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt2 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 2:
            if _v_cnt1_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt1_v
            v_cnt1 -= v_cnt1_v
            a1 = v_cnt1_v
        elif == 3:
            if _v_cnt1_v >= _v_cnt2_v:
                break
            v_cnt1 -= v_cnt1_v
            v_cnt2 += v_cnt1_v
            a1 = v_cnt1_v
        elif == 4:
            if _v_cnt2_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
        elif == 5:
            if _v_cnt2_v >= _v_cnt1_v:
                break
            v_cnt1 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
    = False
    a0 = v_cnt0
    if == (buf_len - 1and a0 == 0 and a1 == 1:
        = True
    return [r, a0, a1]
 
 
def x_crack_part1_raw(buf, offset, cond0, cond1, vct_max, strict=False):
    bits = 5
    # buf[(1 << bits) - 1] == 0
    i7_end = 6 if (offset != 0x18else 1
 
    vct = []
    for i0 in range(6):
        for i1 in range(6):
            for i2 in range(6):
                for i3 in range(6):
                    for i4 in range(6):
                        for i5 in range(6):
                            for i6 in range(6):
                                for i7 in range(i7_end):
                                    buf[offset + 0= i0
                                    buf[offset + 1= i1
                                    buf[offset + 2= i2
                                    buf[offset + 3= i3
                                    buf[offset + 4= i4
                                    buf[offset + 5= i5
                                    buf[offset + 6= i6
                                    buf[offset + 7= i7
                                    r, a_0, a_1 = x_4010A0(buf, bits)
                                    if strict:
                                        ok = r
                                    else:
                                        ok = a_0 <= cond0 and (cond1 < 0 or a_1 <= cond1)
                                    if ok:
                                        = [i0, i1, i2, i3, i4, i5, i6, i7]
                                        if strict:
                                            print('(%s): %s' % (len(vct), v))
                                        vct.append(v)
                                        if (vct_max > 0and (len(vct) >= vct_max):
                                            return vct
 
    return vct
 
 
def x_crack_part1(count, use_cache=True):
    buf = [0* 32
 
    print('crack_part1 0:8')
    offset = 0
    if use_cache:
        vct0 = [[01304501], ]
    else:
        vct0 = x_crack_part1_raw(buf, offset, 0x10-11)
    print vct0
    for in range(8):
        buf[offset + _] = vct0[0][_]
 
    print('crack_part1 8:0x10')
    offset += 8
    if use_cache:
        vct1 = [[21243013], ]
    else:
        vct1 = x_crack_part1_raw(buf, offset, 0x0F-11)
    print vct1
    for in range(8):
        buf[offset + _] = vct1[0][_]
 
    print('crack_part1 0x10:0x18')
    offset += 8
    if use_cache:
        vct2 = [[02020204], ]
    else:
        vct2 = x_crack_part1_raw(buf, offset, 011)
    print vct2
    for in range(8):
        buf[offset + _] = vct2[0][_]
 
    print('crack_part1 0x18:0x20')
    offset += 8
    vct3 = x_crack_part1_raw(buf, offset, 01, count, strict=True)
 
    = []
    for in range(len(vct3)):
        = [_ for in buf]
        for in range(8):
            v[offset + b] = vct3[a][b]
        # print_array(v)
        r.append(v)
    return r
 
 
def x_gen_sn(k):
    # char_map36 = 'abcdefghijklmnopqrstuvwxyz0123456789'
    char_map62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    char_map64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. '
    r0_0 = []
    for in range(0len(k), 2):
        r0_0 = [k[_ + 1* 6 + k[_], ] + r0_0
    = array_to_int(r0_0, 36)
    # print_int(v, 36)
    # print int_to_str(v, char_map36)
    r0_0 = int_to_array(v, 256)
 
    r0_1 = [-1* 4
    r0 = r0_0 + r0_1
 
    v1 = str_to_int('welcome to bbs.pediy.com.'[::-1], char_map64)
    v2 = str_to_int('Author by Lookhc'[::-1], char_map64)
    = (v1 - v2 * 2/ 6
    = + v2
    r1 = int_to_array(x, 256)
    r2 = int_to_array(y, 256)
 
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    r0_1 = crack_crc(k[0:len(r0)], k[4 + len(r0):], 00)
    r0 = r0_0 + r0_1
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    print int_to_str(array_to_int(k, 256), char_map62)
    return
 
 
def test():
    # count = 256
    count = 2
    ks = x_crack_part1(count, use_cache=True)
    for in range(len(ks)):
        x_gen_sn(ks[_])
 
    return
 
 
test()

1
2
3
4
5
6
7
8
.text:00401EF2                 cmp     eax, 0Ah
.text:00401EF5                 jge     loc_40210F
.text:00401EFB                 test    eax, eax
.text:00401EFD                 jnz     short loc_401F30
...
.text:004020FF                 call    bn_compare
.text:00402104                 test    eax, eax
.text:00402106                 jnz     loc_4022E9      ; always jmp

异常处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.text:004022E9                 mov     eax, [ebp+var_3C] ; must be 0
.text:004022EC                 test    eax, eax
.text:004022EE                 jnz     short loc_402305
.text:004022F0                 lea     eax, [ebp+var_48]
.text:004022F3                 push    offset __TI1H   ; throw info for 'int'
.text:004022F8                 push    eax
.text:004022F9                 mov     [ebp+var_48], 1
.text:00402300                 call    __CxxThrowException@8 ; _CxxThrowException(x,x)
 
.text:00402367 ;   catch(...) // owned by 401EE8
.text:00402367                 mov     dword ptr [ebp-30h], 2
.text:0040236E                 mov     eax, offset loc_40211C
.text:00402373                 retn
 
.text:0040211C                 mov     eax, [ebp-30h]
.text:0040211F                 mov     [ebp+var_4], 0FFFFFFFFh
.text:00402126                 cmp     eax, 2
.text:00402129                 jnz     loc_402399

r1-r2=bn2
2*r1+4*r2=bn1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.text:00402189                 call    bn_add
...
.text:004021BB                 call    bn_compare
 
.text:004021CE                 push    4
.text:004021D0                 push    edx
.text:004021D1                 call    bn_int
...
.text:004021F5                 call    bn_mul
.text:004021FA                 lea     ecx, [ebp+var_1970]
.text:00402200                 push    2
.text:00402202                 push    ecx
.text:00402203                 call    bn_int
...
.text:00402226                 call    bn_mul
.text:0040222B                 mov     ecx, 84h
.text:00402230                 mov     esi, offset g_bn1
...
.text:0040225F                 call    bn_add
...
.text:0040228D                 call    bn_rebase

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
crc32_table = [
    0x00000000L0x77073096L0xee0e612cL0x990951baL0x076dc419L0x706af48fL0xe963a535L0x9e6495a3L,
    0x0edb8832L0x79dcb8a4L0xe0d5e91eL0x97d2d988L0x09b64c2bL0x7eb17cbdL0xe7b82d07L0x90bf1d91L,
    0x1db71064L0x6ab020f2L0xf3b97148L0x84be41deL0x1adad47dL0x6ddde4ebL0xf4d4b551L0x83d385c7L,
    0x136c9856L0x646ba8c0L0xfd62f97aL0x8a65c9ecL0x14015c4fL0x63066cd9L0xfa0f3d63L0x8d080df5L,
    0x3b6e20c8L0x4c69105eL0xd56041e4L0xa2677172L0x3c03e4d1L0x4b04d447L0xd20d85fdL0xa50ab56bL,
    0x35b5a8faL0x42b2986cL0xdbbbc9d6L0xacbcf940L0x32d86ce3L0x45df5c75L0xdcd60dcfL0xabd13d59L,
    0x26d930acL0x51de003aL0xc8d75180L0xbfd06116L0x21b4f4b5L0x56b3c423L0xcfba9599L0xb8bda50fL,
    0x2802b89eL0x5f058808L0xc60cd9b2L0xb10be924L0x2f6f7c87L0x58684c11L0xc1611dabL0xb6662d3dL,
    0x76dc4190L0x01db7106L0x98d220bcL0xefd5102aL0x71b18589L0x06b6b51fL0x9fbfe4a5L0xe8b8d433L,
    0x7807c9a2L0x0f00f934L0x9609a88eL0xe10e9818L0x7f6a0dbbL0x086d3d2dL0x91646c97L0xe6635c01L,
    0x6b6b51f4L0x1c6c6162L0x856530d8L0xf262004eL0x6c0695edL0x1b01a57bL0x8208f4c1L0xf50fc457L,
    0x65b0d9c6L0x12b7e950L0x8bbeb8eaL0xfcb9887cL0x62dd1ddfL0x15da2d49L0x8cd37cf3L0xfbd44c65L,
    0x4db26158L0x3ab551ceL0xa3bc0074L0xd4bb30e2L0x4adfa541L0x3dd895d7L0xa4d1c46dL0xd3d6f4fbL,
    0x4369e96aL0x346ed9fcL0xad678846L0xda60b8d0L0x44042d73L0x33031de5L0xaa0a4c5fL0xdd0d7cc9L,
    0x5005713cL0x270241aaL0xbe0b1010L0xc90c2086L0x5768b525L0x206f85b3L0xb966d409L0xce61e49fL,
    0x5edef90eL0x29d9c998L0xb0d09822L0xc7d7a8b4L0x59b33d17L0x2eb40d81L0xb7bd5c3bL0xc0ba6cadL,
    0xedb88320L0x9abfb3b6L0x03b6e20cL0x74b1d29aL0xead54739L0x9dd277afL0x04db2615L0x73dc1683L,
    0xe3630b12L0x94643b84L0x0d6d6a3eL0x7a6a5aa8L0xe40ecf0bL0x9309ff9dL0x0a00ae27L0x7d079eb1L,
    0xf00f9344L0x8708a3d2L0x1e01f268L0x6906c2feL0xf762575dL0x806567cbL0x196c3671L0x6e6b06e7L,
    0xfed41b76L0x89d32be0L0x10da7a5aL0x67dd4accL0xf9b9df6fL0x8ebeeff9L0x17b7be43L0x60b08ed5L,
    0xd6d6a3e8L0xa1d1937eL0x38d8c2c4L0x4fdff252L0xd1bb67f1L0xa6bc5767L0x3fb506ddL0x48b2364bL,
    0xd80d2bdaL0xaf0a1b4cL0x36034af6L0x41047a60L0xdf60efc3L0xa867df55L0x316e8eefL0x4669be79L,
    0xcb61b38cL0xbc66831aL0x256fd2a0L0x5268e236L0xcc0c7795L0xbb0b4703L0x220216b9L0x5505262fL,
    0xc5ba3bbeL0xb2bd0b28L0x2bb45a92L0x5cb36a04L0xc2d7ffa7L0xb5d0cf31L0x2cd99e8bL0x5bdeae1dL,
    0x9b64c2b0L0xec63f226L0x756aa39cL0x026d930aL0x9c0906a9L0xeb0e363fL0x72076785L0x05005713L,
    0x95bf4a82L0xe2b87a14L0x7bb12baeL0x0cb61b38L0x92d28e9bL0xe5d5be0dL0x7cdcefb7L0x0bdbdf21L,
    0x86d3d2d4L0xf1d4e242L0x68ddb3f8L0x1fda836eL0x81be16cdL0xf6b9265bL0x6fb077e1L0x18b74777L,
    0x88085ae6L0xff0f6a70L0x66063bcaL0x11010b5cL0x8f659effL0xf862ae69L0x616bffd3L0x166ccf45L,
    0xa00ae278L0xd70dd2eeL0x4e048354L0x3903b3c2L0xa7672661L0xd06016f7L0x4969474dL0x3e6e77dbL,
    0xaed16a4aL0xd9d65adcL0x40df0b66L0x37d83bf0L0xa9bcae53L0xdebb9ec5L0x47b2cf7fL0x30b5ffe9L,
    0xbdbdf21cL0xcabac28aL0x53b39330L0x24b4a3a6L0xbad03605L0xcdd70693L0x54de5729L0x23d967bfL,
    0xb3667a2eL0xc4614ab8L0x5d681b02L0x2a6f2b94L0xb40bbe37L0xc30c8ea1L0x5a05df1bL0x2d02ef8dL
]
 
crc32_table_highest_byte_map = [-1* 256
for in range(256):
    crc32_table_highest_byte_map[(crc32_table[i] >> 24) & 0xFF= i
 
 
def array_to_int(k, base):
    = 0
    = 1
    for in k:
        += * _
        *= base
    return v
 
 
def int_to_array(v, base):
    = []
    while v != 0:
        r.append(v % base)
        = / base
    return r
 
 
def str_to_int(s, char_map):  # type:(str,str) -> int
    = []
    for in s:
        r.append(char_map.find(_))
    return array_to_int(r, len(char_map))
 
 
def int_to_str(v, char_map):  # type:(int,str) -> str
 
    = int_to_array(v, len(char_map))
    = ''
    for in r:
        = char_map[_] + s
    return s
 
 
def print_array(r):
    = ''
    for in r:
        += ('%x' % _).zfill(2+ ' '
    print s
    return
 
 
def print_int(v, base):
    = int_to_array(v, base)
    print_array(r)
    return
 
 
def array_to_str(k):
    = ''
    for in k:
        += chr(_)
    return s
 
 
def str_to_array(s):
    = []
    for in s:
        k.append(ord(s))
    return k
 
 
def crc32_update(k, crc):
    for in k:
        crc = (crc >> 8) ^ crc32_table[b ^ (crc & 0xFF)]
    return crc
 
 
def get_crc32_update_init_value(k, crc):
    = len(k) - 1
    while z >= 0:
        idx = crc32_table_highest_byte_map[(crc >> 24) & 0xFF]
        crc = ((crc32_table[idx] ^ crc) << 8) | (idx ^ k[z])
        -= 1
    return crc
 
 
def crc32(k, crc_init=0):
    crc = crc_init
    crc = (~crc) & 0xFFFFFFFF
    crc = crc32_update(k, crc)
    crc = (~crc) & 0xFFFFFFFF
    return crc
 
 
def crc_RF(x):
    return crc32_table_highest_byte_map[x]
 
 
def crc_F(x):
    return (crc32_table[x] >> 24) & 0xFF
 
 
def crc_G(x):
    return (crc32_table[x] >> 16) & 0xFF
 
 
def crc_H(x):
    return (crc32_table[x] >> 8) & 0xFF
 
 
def crc_I(x):
    return (crc32_table[x] >> 0) & 0xFF
 
 
def crack_crc(s_head, s_tail, crc_init, crc_final):
    crc1 = (~crc_init) & 0xFFFFFFFF
    crc1 = crc32_update(s_head, crc1)
    crc2 = (~crc_final) & 0xFFFFFFFF
    crc2 = get_crc32_update_init_value(s_tail, crc2)
 
    # hxxps://bbs.pediy.com/thread-8699.htm
    = (crc2 >> 24) & 0xFF
    = (crc2 >> 16) & 0xFF
    = (crc2 >> 8) & 0xFF
    = (crc2 >> 0) & 0xFF
 
    = (crc1 >> 24) & 0xFF
    = (crc1 >> 16) & 0xFF
    = (crc1 >> 8) & 0xFF
    = (crc1 >> 0) & 0xFF
 
    = crc_RF(W)
    = crc_RF(X ^ crc_G(p))
    = crc_RF(Y ^ crc_G(o) ^ crc_H(p))
    = crc_RF(Z ^ crc_G(n) ^ crc_H(o) ^ crc_I(p))
 
    = m ^ D
    = n ^ C ^ crc_I(m)
    = o ^ B ^ crc_H(m) ^ crc_I(n)
    = p ^ A ^ crc_G(m) ^ crc_H(n) ^ crc_I(o)
    return [d, c, b, a]
 
 
def check_crc_table():
    print('xxstart')
    k3 = [0* 256
    k2 = [0* 256
    k1 = [0* 256
    k0 = [0* 256
    for in range(256):
        k3[(crc32_table[_] >> 24) & 0xFF+= 1
        k2[(crc32_table[_] >> 16) & 0xFF+= 1
        k1[(crc32_table[_] >> 8) & 0xFF+= 1
        k0[(crc32_table[_] >> 0) & 0xFF+= 1
    for in range(256):
        if k3[_] != 1:
            print('k3[%s]=%s' % (_, k3[_]))
        # if k2[_] != 1:
        #     print('k2[%s]=%s' % (_, k2[_]))
        # if k1[_] != 1:
        #     print('k1[%s]=%s' % (_, k1[_]))
        # if k0[_] != 1:
        #     print('k0[%s]=%s' % (_, k0[_]))
    print('xxend')
    return
 
 
def x_401080(v):
    if == 0:
        return 0
    = 1
    while (v & 1== 0:
        v >>= 1
        *= 2
        if == 0:
            return 0
    return r
 
 
def x_4010A0(buf, bits):
    a1 = 0
    buf_len = (1 << bits) - 1
    v_cnt0 = buf_len
    v_cnt1 = 0
    v_cnt2 = 0
 
    = 0
    for in range(buf_len):
        = buf[_]
        v_cnt0_v = x_401080(v_cnt0)
        v_cnt1_v = x_401080(v_cnt1)
        v_cnt2_v = x_401080(v_cnt2)
        _v_cnt0_v = v_cnt0_v if v_cnt0_v != 0 else 100
        _v_cnt1_v = v_cnt1_v if v_cnt1_v != 0 else 100
        _v_cnt2_v = v_cnt2_v if v_cnt2_v != 0 else 100
        if == 0:
            if _v_cnt0_v >= _v_cnt1_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt1 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 1:
            if _v_cnt0_v >= _v_cnt2_v:
                break
            v_cnt0 -= v_cnt0_v
            v_cnt2 += v_cnt0_v
            a1 = v_cnt0_v
        elif == 2:
            if _v_cnt1_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt1_v
            v_cnt1 -= v_cnt1_v
            a1 = v_cnt1_v
        elif == 3:
            if _v_cnt1_v >= _v_cnt2_v:
                break
            v_cnt1 -= v_cnt1_v
            v_cnt2 += v_cnt1_v
            a1 = v_cnt1_v
        elif == 4:
            if _v_cnt2_v >= _v_cnt0_v:
                break
            v_cnt0 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
        elif == 5:
            if _v_cnt2_v >= _v_cnt1_v:
                break
            v_cnt1 += v_cnt2_v
            v_cnt2 -= v_cnt2_v
            a1 = v_cnt2_v
    = False
    a0 = v_cnt0
    if == (buf_len - 1and a0 == 0 and a1 == 1:
        = True
    return [r, a0, a1]
 
 
def x_crack_part1_raw(buf, offset, cond0, cond1, vct_max, strict=False):
    bits = 5
    # buf[(1 << bits) - 1] == 0
    i7_end = 6 if (offset != 0x18else 1
 
    vct = []
    for i0 in range(6):
        for i1 in range(6):
            for i2 in range(6):
                for i3 in range(6):
                    for i4 in range(6):
                        for i5 in range(6):
                            for i6 in range(6):
                                for i7 in range(i7_end):
                                    buf[offset + 0= i0
                                    buf[offset + 1= i1
                                    buf[offset + 2= i2
                                    buf[offset + 3= i3
                                    buf[offset + 4= i4
                                    buf[offset + 5= i5
                                    buf[offset + 6= i6
                                    buf[offset + 7= i7
                                    r, a_0, a_1 = x_4010A0(buf, bits)
                                    if strict:
                                        ok = r
                                    else:
                                        ok = a_0 <= cond0 and (cond1 < 0 or a_1 <= cond1)
                                    if ok:
                                        = [i0, i1, i2, i3, i4, i5, i6, i7]
                                        if strict:
                                            print('(%s): %s' % (len(vct), v))
                                        vct.append(v)
                                        if (vct_max > 0and (len(vct) >= vct_max):
                                            return vct
 
    return vct
 
 
def x_crack_part1(count, use_cache=True):
    buf = [0* 32
 
    print('crack_part1 0:8')
    offset = 0
    if use_cache:
        vct0 = [[01304501], ]
    else:
        vct0 = x_crack_part1_raw(buf, offset, 0x10-11)
    print vct0
    for in range(8):
        buf[offset + _] = vct0[0][_]
 
    print('crack_part1 8:0x10')
    offset += 8
    if use_cache:
        vct1 = [[21243013], ]
    else:
        vct1 = x_crack_part1_raw(buf, offset, 0x0F-11)
    print vct1
    for in range(8):
        buf[offset + _] = vct1[0][_]
 
    print('crack_part1 0x10:0x18')
    offset += 8
    if use_cache:
        vct2 = [[02020204], ]
    else:
        vct2 = x_crack_part1_raw(buf, offset, 011)
    print vct2
    for in range(8):
        buf[offset + _] = vct2[0][_]
 
    print('crack_part1 0x18:0x20')
    offset += 8
    vct3 = x_crack_part1_raw(buf, offset, 01, count, strict=True)
 
    = []
    for in range(len(vct3)):
        = [_ for in buf]
        for in range(8):
            v[offset + b] = vct3[a][b]
        # print_array(v)
        r.append(v)
    return r
 
 
def x_gen_sn(k):
    # char_map36 = 'abcdefghijklmnopqrstuvwxyz0123456789'
    char_map62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    char_map64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. '
    r0_0 = []
    for in range(0len(k), 2):
        r0_0 = [k[_ + 1* 6 + k[_], ] + r0_0
    = array_to_int(r0_0, 36)
    # print_int(v, 36)
    # print int_to_str(v, char_map36)
    r0_0 = int_to_array(v, 256)
 
    r0_1 = [-1* 4
    r0 = r0_0 + r0_1
 
    v1 = str_to_int('welcome to bbs.pediy.com.'[::-1], char_map64)
    v2 = str_to_int('Author by Lookhc'[::-1], char_map64)
    = (v1 - v2 * 2/ 6
    = + v2
    r1 = int_to_array(x, 256)
    r2 = int_to_array(y, 256)
 
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    r0_1 = crack_crc(k[0:len(r0)], k[4 + len(r0):], 00)
    r0 = r0_0 + r0_1
    = [len(r0) - 4len(r0), len(r1), len(r2)] + r0 + r1 + r2
    print int_to_str(array_to_int(k, 256), char_map62)
    return
 
 
def test():
    # count = 256
    count = 2
    ks = x_crack_part1(count, use_cache=True)
    for in range(len(ks)):
        x_gen_sn(ks[_])
 
    return
 
 
test()

1
2
3
4
5
6
7
8
.text:00401EF2                 cmp     eax, 0Ah
.text:00401EF5                 jge     loc_40210F
.text:00401EFB                 test    eax, eax
.text:00401EFD                 jnz     short loc_401F30
...
.text:004020FF                 call    bn_compare
.text:00402104                 test    eax, eax
.text:00402106                 jnz     loc_4022E9      ; always jmp

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

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-2-4 02:24
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

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