36DCTF-wp

2020-36DCTF

easyre

IDA打开是下面这个样子

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
int __cdecl main(int argc, const char **argv, const char **envp)
{
__int64 v3; // rdx
__int64 v4; // rcx
int v6; // [rsp+4h] [rbp-8Ch]
unsigned int v7; // [rsp+8h] [rbp-88h]
int v8; // [rsp+Ch] [rbp-84h]
int v9; // [rsp+10h] [rbp-80h]
int v10; // [rsp+14h] [rbp-7Ch]
int v11; // [rsp+18h] [rbp-78h]
int v12; // [rsp+1Ch] [rbp-74h]
int v13; // [rsp+20h] [rbp-70h]
int v14; // [rsp+24h] [rbp-6Ch]
int v15; // [rsp+28h] [rbp-68h]
int v16; // [rsp+2Ch] [rbp-64h]
int v17; // [rsp+30h] [rbp-60h]
int v18; // [rsp+34h] [rbp-5Ch]
int v19; // [rsp+38h] [rbp-58h]
int v20; // [rsp+3Ch] [rbp-54h]
int v21; // [rsp+40h] [rbp-50h]
int v22; // [rsp+44h] [rbp-4Ch]
int v23; // [rsp+48h] [rbp-48h]
int v24; // [rsp+4Ch] [rbp-44h]
int v25; // [rsp+50h] [rbp-40h]
int v26; // [rsp+54h] [rbp-3Ch]
int v27; // [rsp+58h] [rbp-38h]
int v28; // [rsp+5Ch] [rbp-34h]
int v29; // [rsp+60h] [rbp-30h]
int v30; // [rsp+64h] [rbp-2Ch]
int v31; // [rsp+68h] [rbp-28h]
int v32; // [rsp+6Ch] [rbp-24h]
int v33; // [rsp+70h] [rbp-20h]
int v34; // [rsp+74h] [rbp-1Ch]
int v35; // [rsp+78h] [rbp-18h]
int v36; // [rsp+7Ch] [rbp-14h]
int v37; // [rsp+80h] [rbp-10h]
int v38; // [rsp+84h] [rbp-Ch]
int v39; // [rsp+88h] [rbp-8h]
char v40; // [rsp+8Ch] [rbp-4h]

v9 = 102;
v10 = 109;
v11 = 99;
v12 = 98;
v13 = 127;
v14 = 58;
v15 = 85;
v16 = 106;
v17 = 57;
v18 = 82;
v19 = 122;
v20 = 55;
v21 = 81;
v22 = 19;
v23 = 51;
v24 = 35;
v25 = 67;
v26 = 70;
v27 = 41;
v28 = 61;
v29 = 41;
v30 = 32;
v31 = 127;
v32 = 28;
v33 = 38;
v34 = 77;
v35 = 49;
v36 = 20;
v37 = 80;
v38 = 94;
v39 = 0xFFFFFFE8;
sub_4007F8((__int64)&v40, 0LL, 4LL);
v7 = 0;
v6 = 0;
sub_400808((__int64)aFlag);
do
{
v8 = sub_400818((__int64)aFlag, 0LL);
v6 |= v8 ^ v7 ^ (v7 + (v7 ^ *(&v9 + (signed int)v7)));
v4 = v7++;
}
while ( v8 && v8 != 10 && v8 != -1 );
if ( v6 )
sub_400828(aFailed, 0LL, v3, v4);
else
sub_400828(aCorrect, 0LL, v3, v4);
return 0;
}

很简单,写个脚本就出来了,签到成功

1
2
3
4
5
6
7
target = [102, 109, 99, 98, 127, 58, 85, 106, 57, 82, 122, 55, 81, 19, 51, 35, 67, 70, 41, 61, 41, 32, 127, 28, 38, 77,
49, 20, 80, 94]
flag = ""
for i in range(len(target)):
flag += chr(i ^ (i + (i ^ target[i])))
print(flag)
# flag{A_s1mpLe&E4sy_RE_i5Nt_1t}

神光

IDA打开,根据提示语找到关键函数

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
int __usercall sub_415C10@<eax>(int a1@<xmm0>, int a2@<ebx>)
{
int v2; // eax
int v3; // edx
int v4; // ecx
int v5; // eax
int v6; // edx
int v7; // ecx
int v8; // ecx
int v9; // eax
int v10; // edx
int v11; // ecx
int v12; // edx
int v13; // ST0C_4
char v15; // [esp+0h] [ebp-ECh]
char input1; // [esp+D0h] [ebp-1Ch]
int v17; // [esp+E8h] [ebp-4h]
int savedregs; // [esp+ECh] [ebp+0h]

sub_41122B((int)&unk_41C032);
sub_411406();
while ( 1 )
{
printf((int)"请输入key:\n", v15);
scanf((const char *)&unk_417B40, (unsigned int)&input1, 20);
sub_4113B1(a1, &input1);
if ( target1 )
break;
v2 = puts("系统错误,请再试一次\n");
sub_411235(v4, v3, &v15 == &v15, v2, a1);
}
sub_41141A(a1);
v5 = MessageBoxA(0, "认证成功,离flag又近了一步", "恭喜", 0);
sub_411235(v7, v6, &v15 == &v15, v5, a1);
sub_4113CF(a1, v8, a2, (int)&v15, &input1);
v9 = system("pause");
sub_411235(v11, v10, &v15 == &v15, v9, a1);
v13 = v12;
sub_411258((int)&savedregs, (int)byte_415D18);
return sub_411235((unsigned int)&savedregs ^ v17, v13, 1, 0, a1);
}

输入key之后在下面的函数里进行验证

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
int __usercall sub_415B10@<eax>(int a1@<xmm0>, char *input1)
{
int v2; // eax
int v3; // edx
int v4; // eax
int v5; // edx
int v6; // ecx
int v7; // eax
__int64 v8; // rtt
int v9; // ST04_4
int v10; // ST00_4
int v12; // [esp+0h] [ebp-E8h]
char Str2; // [esp+D0h] [ebp-18h]
char v14; // [esp+D1h] [ebp-17h]
char v15; // [esp+D2h] [ebp-16h]
char v16; // [esp+D3h] [ebp-15h]
char v17; // [esp+D4h] [ebp-14h]
char v18; // [esp+D5h] [ebp-13h]
char v19; // [esp+D6h] [ebp-12h]
char v20; // [esp+D7h] [ebp-11h]
char v21; // [esp+D8h] [ebp-10h]
char v22; // [esp+D9h] [ebp-Fh]
char v23; // [esp+DAh] [ebp-Eh]
char v24; // [esp+DBh] [ebp-Dh]
char v25; // [esp+DCh] [ebp-Ch]
char v26; // [esp+DDh] [ebp-Bh]
char v27; // [esp+DEh] [ebp-Ah]
int v28; // [esp+E4h] [ebp-4h]
int savedregs; // [esp+E8h] [ebp+0h]

sub_41122B((int)&unk_41C032);
Str2 = 'w';
v14 = 'a';
v15 = 'n';
v16 = 'g';
v17 = 'z';
v18 = 'h';
v19 = 'e';
v20 = 'r';
v21 = 'o';
v22 = 'n';
v23 = 'g';
v24 = 'y';
v25 = 'a';
v26 = 'o';
v27 = 0;
v2 = j_strcmp(input1, &Str2);
if ( v2 )
{
target1 = 0;
}
else
{
v4 = rand();
v7 = sub_411235(v6, v5, &v12 == &v12, v4, a1);
v8 = v7;
v2 = v7 / 10;
v3 = v8 % 10;
target1 = v8 % 10;
}
v9 = v3;
v10 = v2;
sub_411258((int)&savedregs, (int)dword_415BEC);
return sub_411235((unsigned int)&savedregs ^ v28, v9, 1, v10, a1);
}

输入的key应该是wangzherongyao

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
int __usercall sub_415770@<eax>(int a1@<xmm0>, int a2@<ecx>, int a3@<ebx>, int a4@<esi>, char *Str)
{
size_t v5; // eax
int v6; // eax
int v7; // edx
int v8; // ecx
char v10; // [esp+0h] [ebp-15D8h]
int j; // [esp+610h] [ebp-FC8h]
unsigned int i; // [esp+61Ch] [ebp-FBCh]
int v13; // [esp+15C4h] [ebp-14h]
int v14; // [esp+15C8h] [ebp-10h]
int v15; // [esp+15D0h] [ebp-8h]
int savedregs; // [esp+15D8h] [ebp+0h]

sub_4113ED(0x15D8u, a2);
memset(&v10, 0xCCu, 0x15D8u);
sub_41122B((int)&unk_41C032);
v15 = 0;
for ( i = 0; ; ++i )
{
v5 = j_strlen(Str);
if ( i >= v5 )
break;
v15 += Str[i];
}
for ( j = 0; j < 38; ++j )
{
step2[j] += v15;
step2[j] ^= dword_41A4DC;
}
step2[++j] = 0;
v6 = sub_4113E3(a1, a3, (int)&savedregs, a4, (int)step2);
v14 = v7;
v13 = v6;
sub_411258((int)&savedregs, (int)dword_41589C);
return sub_411235(v8, v14, 1, v13, a1);
}

下面的处理就是把key求和赋值给v15,然后将内容中的数组逐项与v15相加然后异或

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
int __usercall sub_415970@<eax>(int a1@<xmm0>, int ebx0@<ebx>, int a3@<edi>, int a4@<esi>, int target)
{
int v5; // STF0_4
int v6; // eax
int v7; // edx
int v8; // ST04_4
int v9; // ST00_4
signed int i; // [esp+DCh] [ebp-84h]
int v12; // [esp+E8h] [ebp-78h]
int v13; // [esp+E8h] [ebp-78h]
char v14[104]; // [esp+F4h] [ebp-6Ch]
int v15; // [esp+15Ch] [ebp-4h]
int savedregs; // [esp+160h] [ebp+0h]

sub_41122B((int)&unk_41C032);
v12 = 0;
for ( i = 0; i < 9; ++i )
{
v14[v12] = *(_BYTE *)(target + 4 * i);
v5 = v12 + 1;
v14[v5++] = *(_BYTE *)(target + 4 * i + 36);
v14[v5++] = *(_BYTE *)(target + 4 * i + 72);
v14[v5] = *(_BYTE *)(target + 4 * i + 108);
v12 = v5 + 1;
}
v14[v12] = *(_BYTE *)(target + 144);
v13 = v12 + 1;
v14[v13] = *(_BYTE *)(target + 148);
if ( (unsigned int)(v13 + 1) >= 0x64 )
sub_411168(ebx0, a3, a4);
v14[v13 + 1] = 0;
v6 = printf((int)"\n%s\n", (unsigned int)v14);
v8 = v7;
v9 = v6;
sub_411258((int)&savedregs, (int)dword_415AF0);
return sub_411235((unsigned int)&savedregs ^ v15, v8, 1, v9, a1);
}

之后就是每9位一组,把得到的字符串重新排序然后输出,但是没有这么轻松,输出的是乱码,因为用来异或的数只有在TLS回调函数里面用到了,如果正常运行的话应该是0,并没有什么意义,所以很显然这题只要调试一下输出的应该就是真正的flag,OD装了hidden忘了关掉,调试了一次发现输出还是乱码,干脆直接算出这个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
step1 = "wangzherongyao"
v15 = 0
for i in range(len(step1)):
v15 += ord(step1[i])
final = [0xFFFFF9A6, 0xFFFFF991, 0xFFFFF9D3, 0xFFFFF9A8, 0xFFFFF9DC, 0xFFFFF9D5, 0xFFFFF9DC, 0xFFFFF9D4, 0xFFFFF9D8,
0xFFFFF9A0, 0xFFFFF9D3, 0xFFFFF9A7, 0xFFFFF9A8, 0xFFFFF9D4, 0xFFFFF9DB, 0xFFFFF9A9, 0xFFFFF9D3, 0xFFFFF9A8,
0xFFFFF9AB, 0xFFFFF9D3, 0xFFFFF9DA, 0xFFFFF9D6, 0xFFFFF9D4, 0xFFFFF9AB, 0xFFFFF9AB, 0xFFFFF9DB, 0xFFFFF9A9,
0xFFFFF9A5, 0xFFFFF9D6, 0xFFFFF9A8, 0xFFFFF9D8, 0xFFFFF9A6, 0xFFFFF9A6, 0xFFFFF9AB, 0xFFFFF9AA, 0xFFFFF9D6,
0xFFFFF9D9, 0xFFFFF98F]
for i in range(38):
final[i] = (final[i] + v15) & 0xff
v = final[0] ^ ord('f')
for i in range(38):
final[i] = final[i] ^ v
flag = ""
for i in range(9):
flag += chr(final[i])
flag += chr(final[i + 9])
flag += chr(final[i + 9 * 2])
flag += chr(final[i + 9 * 3])
flag += chr(final[36]) + chr(final[37])
print(flag)
# flag{9969e2ddd64088f71af0caa891b4dc63}

BBBigEqSet

打开发现函数很大,有很多式子,无脑z3必定跑不出来,下面只截取了一部分

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
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // edx
int v4; // edx
int v5; // edx
int v6; // edx
int v7; // edx
int v8; // edx
int v9; // edx
int v10; // edx
int v11; // edx
int v12; // edx
int v13; // edx
int v14; // edx
int v15; // edx
int v16; // edx
int v17; // edx
int v18; // edx
int v19; // edx
int v20; // edx
int v21; // edx
int v22; // edx
int v23; // edx
int v24; // edx
int v25; // edx
int v26; // edx
int v27; // edx
int v28; // edx
int v29; // edx
int v30; // edx
int v31; // edx
int v32; // edx
int v33; // edx
int v34; // edx
int v35; // edx
int v36; // edx
int v37; // edx
int v38; // edx
int v39; // edx
int v40; // edx
int v41; // edx
int v42; // edx
int v43; // edx
int v44; // edx
int v45; // edx
int v46; // edx
int v47; // edx
int v48; // edx
int v49; // edx
int v50; // edx
int v51; // edx
int v52; // edx
int v53; // edx
int v54; // edx
int v55; // edx
int v56; // edx
int v57; // edx
int v58; // edx
int v59; // edx
int v60; // edx
int v61; // edx
int v62; // edx
int v63; // edx
int v64; // edx
int v65; // edx
int v66; // edx
int v67; // edx
int v68; // edx
int v69; // edx
int v70; // edx
int v71; // edx
int v72; // edx
int v73; // edx
int v74; // edx
int v75; // edx
int v76; // edx
int v77; // edx
int v78; // edx
int v79; // edx
int v80; // edx
int v81; // edx
int v82; // edx
int v83; // edx
int v84; // edx
int v85; // edx
int v86; // edx
int v87; // edx
int v88; // edx
int v89; // edx
int v90; // edx
int v91; // edx
int v92; // edx
int v93; // edx
int v94; // edx
int v95; // edx
int v96; // edx
int v97; // edx
int v98; // edx
int v99; // edx
int v100; // edx
int v101; // edx
int v102; // edx
int v103; // edx
int v104; // edx
int v105; // edx
int v106; // edx
int v107; // edx
int v108; // edx
int v109; // edx
int v110; // edx
int v111; // edx
int v112; // edx
int v113; // edx
int v114; // edx
int v115; // edx
int v116; // edx
int v117; // edx
int v118; // edx
int v119; // edx
int v120; // edx
int v121; // edx
int v122; // edx
int v123; // edx
int v124; // edx
int v125; // edx
int v126; // edx
int v127; // edx
int v128; // edx
int v129; // edx
int v130; // edx
int v131; // edx
int v132; // edx
int v133; // edx
int v134; // edx
int v135; // edx
int v136; // edx
int v137; // edx
int v138; // edx
int v139; // edx
int v140; // edx
int v141; // edx
int v142; // edx
int v143; // edx
int v144; // edx
int v145; // edx
int v146; // edx
int v147; // edx
int v148; // edx
int v149; // edx
int v150; // edx
int v151; // edx
int v152; // edx
int v153; // edx
int v154; // edx
int v155; // edx
int v156; // edx
int v157; // edx
int v158; // edx
int v159; // edx
int v160; // edx
int v161; // edx
int v162; // edx
int v163; // edx
int v164; // edx
int v165; // edx
int v166; // edx
int v167; // edx
int v168; // edx
int v169; // edx
int v170; // edx
int v171; // edx
int v172; // edx
int v173; // edx
int v174; // edx
int v175; // edx
int v176; // edx
int v177; // edx
int v178; // edx
int v179; // edx
int v180; // edx
int v181; // edx
int v182; // edx
int v183; // edx
int v184; // edx
int v185; // edx
int v186; // edx
int v187; // edx
int v188; // edx
int v189; // edx
int v190; // edx
int v191; // edx
int v192; // edx
int v193; // edx
int v194; // edx
int v195; // edx
int v196; // edx
int v197; // edx
int v198; // edx
int v199; // edx
int v200; // edx
int v201; // edx
int v202; // edx
int v203; // edx
int v204; // edx
int v205; // edx
int v206; // edx
int v207; // edx
int v208; // edx
int v209; // edx
int v210; // edx
int v211; // edx
int v212; // edx
int v213; // edx
int v214; // edx
int v215; // edx
int v216; // edx
int v217; // edx
int v218; // edx
int v219; // edx
int v220; // edx
int v221; // edx
int v222; // edx
int v223; // edx
int v224; // edx
int v225; // edx
int v226; // edx
int v227; // edx
int v228; // edx
int v229; // edx
int v230; // edx
int v231; // edx
int v232; // edx
int v233; // edx
int v234; // edx
int v235; // edx
int v236; // edx
int v237; // edx
int v238; // edx
int v239; // edx
int v240; // edx
int v241; // edx
int v242; // edx
int v243; // edx
int v244; // edx
int v245; // edx
int v246; // edx
int v247; // edx
int v248; // edx
int v249; // edx
int v250; // edx
int v251; // edx
int v252; // edx
int v253; // edx
int v254; // edx
int v255; // edx
int v256; // edx
int v257; // edx
int v258; // edx
int v259; // edx
int v260; // edx
int v261; // edx
int v262; // edx
int v263; // edx
int v264; // edx
int v265; // edx
int v266; // edx
int v267; // edx
int v268; // edx
int v269; // edx
int v270; // edx
int v271; // edx
int v272; // edx
int v273; // edx
int v274; // edx
int v275; // edx
int v276; // edx
int v277; // edx
int v278; // edx
int v279; // edx
int v280; // edx
int v281; // edx
int v282; // edx
int v283; // edx
int v284; // edx
int v285; // edx
int v286; // edx
int v287; // edx
int v288; // edx
int v289; // edx
int v290; // edx
int v291; // edx
int v292; // edx
int v293; // edx
int v294; // edx
int v295; // edx
int v296; // edx
int v297; // edx
int v298; // edx
int v299; // edx
int v300; // edx
int v301; // edx
int v302; // edx
int v303; // edx
int v304; // edx
int v305; // edx
int v306; // edx
int v307; // edx
int v308; // edx
int v309; // edx
int v310; // edx
int v311; // edx
int v312; // edx
int v313; // edx
int v314; // edx
int v315; // edx
int v316; // edx
int v317; // edx
int v318; // edx
int v319; // edx
int v320; // edx
int v321; // edx
int v322; // edx
int v323; // edx
int v324; // edx
int v325; // edx
int v326; // edx
int v327; // edx
int v328; // edx
int v329; // edx
int v330; // edx
int v331; // edx
int v332; // edx
int v333; // edx
int v334; // edx
int v335; // edx
int v336; // edx
int v337; // edx
int v338; // edx
int v339; // edx
int v340; // edx
int v341; // edx
int v342; // edx
int v343; // edx
int v344; // edx
int v345; // edx
int v346; // edx
int v347; // edx
int v348; // edx
int v349; // edx
int v350; // edx
int v351; // edx
int v352; // edx
int v353; // edx
int v354; // edx
int v355; // edx
int v356; // edx
int v357; // edx
int v358; // edx
int v359; // edx
int v360; // edx
int v361; // edx
int v362; // edx
int v363; // edx
int v364; // edx
int v365; // edx
int v366; // edx
int v367; // edx
int v368; // edx
int v369; // edx
int v370; // edx
int v371; // edx
int v372; // edx
int v373; // edx
int v374; // edx
int v375; // edx
int v376; // edx
int v377; // edx
int v378; // edx
int v379; // edx
int v380; // edx
int v381; // edx
int v382; // edx
int v383; // edx
int v384; // edx
int v385; // edx
int v386; // edx
char s; // [rsp+0h] [rbp-100h]
char v388; // [rsp+1h] [rbp-FFh]
char v389; // [rsp+2h] [rbp-FEh]
char v390; // [rsp+3h] [rbp-FDh]
char v391; // [rsp+4h] [rbp-FCh]
char v392; // [rsp+5h] [rbp-FBh]
char v393; // [rsp+6h] [rbp-FAh]
char v394; // [rsp+7h] [rbp-F9h]
char v395; // [rsp+8h] [rbp-F8h]
char v396; // [rsp+9h] [rbp-F7h]
char v397; // [rsp+Ah] [rbp-F6h]
char v398; // [rsp+Bh] [rbp-F5h]
char v399; // [rsp+Ch] [rbp-F4h]
char v400; // [rsp+Dh] [rbp-F3h]
char v401; // [rsp+Eh] [rbp-F2h]
char v402; // [rsp+Fh] [rbp-F1h]
char v403; // [rsp+10h] [rbp-F0h]
char v404; // [rsp+11h] [rbp-EFh]
char v405; // [rsp+12h] [rbp-EEh]
char v406; // [rsp+13h] [rbp-EDh]
char v407; // [rsp+14h] [rbp-ECh]
char v408; // [rsp+15h] [rbp-EBh]
char v409; // [rsp+16h] [rbp-EAh]
char v410; // [rsp+17h] [rbp-E9h]
char v411; // [rsp+18h] [rbp-E8h]
char v412; // [rsp+19h] [rbp-E7h]
char v413; // [rsp+1Ah] [rbp-E6h]
char v414; // [rsp+1Bh] [rbp-E5h]
char v415; // [rsp+1Ch] [rbp-E4h]
char v416; // [rsp+1Dh] [rbp-E3h]
char v417; // [rsp+1Eh] [rbp-E2h]
char v418; // [rsp+1Fh] [rbp-E1h]
char v419; // [rsp+20h] [rbp-E0h]
char v420; // [rsp+21h] [rbp-DFh]
char v421; // [rsp+22h] [rbp-DEh]
char v422; // [rsp+23h] [rbp-DDh]
char v423; // [rsp+24h] [rbp-DCh]
char v424; // [rsp+25h] [rbp-DBh]
char v425; // [rsp+26h] [rbp-DAh]
char v426; // [rsp+27h] [rbp-D9h]
char v427; // [rsp+28h] [rbp-D8h]
char v428; // [rsp+29h] [rbp-D7h]
char v429; // [rsp+2Ah] [rbp-D6h]
char v430; // [rsp+2Bh] [rbp-D5h]
char v431; // [rsp+2Ch] [rbp-D4h]
char v432; // [rsp+2Dh] [rbp-D3h]
char v433; // [rsp+2Eh] [rbp-D2h]
char v434; // [rsp+2Fh] [rbp-D1h]
char v435; // [rsp+30h] [rbp-D0h]
char v436; // [rsp+31h] [rbp-CFh]
char v437; // [rsp+32h] [rbp-CEh]
char v438; // [rsp+33h] [rbp-CDh]
char v439; // [rsp+34h] [rbp-CCh]
char v440; // [rsp+35h] [rbp-CBh]
char v441; // [rsp+36h] [rbp-CAh]
char v442; // [rsp+37h] [rbp-C9h]
char v443; // [rsp+38h] [rbp-C8h]
char v444; // [rsp+39h] [rbp-C7h]
char v445; // [rsp+3Ah] [rbp-C6h]
char v446; // [rsp+3Bh] [rbp-C5h]
char v447; // [rsp+3Ch] [rbp-C4h]
char v448; // [rsp+3Dh] [rbp-C3h]
char v449; // [rsp+3Eh] [rbp-C2h]
char v450; // [rsp+3Fh] [rbp-C1h]
char v451; // [rsp+40h] [rbp-C0h]
char v452; // [rsp+41h] [rbp-BFh]
char v453; // [rsp+42h] [rbp-BEh]
char v454; // [rsp+43h] [rbp-BDh]
char v455; // [rsp+44h] [rbp-BCh]
char v456; // [rsp+45h] [rbp-BBh]
char v457; // [rsp+46h] [rbp-BAh]
char v458; // [rsp+47h] [rbp-B9h]
char v459; // [rsp+48h] [rbp-B8h]
char v460; // [rsp+49h] [rbp-B7h]
char v461; // [rsp+4Ah] [rbp-B6h]
char v462; // [rsp+4Bh] [rbp-B5h]
char v463; // [rsp+4Ch] [rbp-B4h]
char v464; // [rsp+4Dh] [rbp-B3h]
char v465; // [rsp+4Eh] [rbp-B2h]
char v466; // [rsp+4Fh] [rbp-B1h]
char v467; // [rsp+50h] [rbp-B0h]
char v468; // [rsp+51h] [rbp-AFh]
char v469; // [rsp+52h] [rbp-AEh]
char v470; // [rsp+53h] [rbp-ADh]
char v471; // [rsp+54h] [rbp-ACh]
char v472; // [rsp+55h] [rbp-ABh]
char v473; // [rsp+56h] [rbp-AAh]
char v474; // [rsp+57h] [rbp-A9h]
char v475; // [rsp+58h] [rbp-A8h]
char v476; // [rsp+59h] [rbp-A7h]
char v477; // [rsp+5Ah] [rbp-A6h]
char v478; // [rsp+5Bh] [rbp-A5h]
char v479; // [rsp+5Ch] [rbp-A4h]
char v480; // [rsp+5Dh] [rbp-A3h]
char v481; // [rsp+5Eh] [rbp-A2h]
char v482; // [rsp+5Fh] [rbp-A1h]
char v483; // [rsp+60h] [rbp-A0h]
char v484; // [rsp+61h] [rbp-9Fh]
char v485; // [rsp+62h] [rbp-9Eh]
char v486; // [rsp+63h] [rbp-9Dh]
char v487; // [rsp+64h] [rbp-9Ch]
char v488; // [rsp+65h] [rbp-9Bh]
char v489; // [rsp+66h] [rbp-9Ah]
char v490; // [rsp+67h] [rbp-99h]
char v491; // [rsp+68h] [rbp-98h]
char v492; // [rsp+69h] [rbp-97h]
char v493; // [rsp+6Ah] [rbp-96h]
char v494; // [rsp+6Bh] [rbp-95h]
char v495; // [rsp+6Ch] [rbp-94h]
char v496; // [rsp+6Dh] [rbp-93h]
char v497; // [rsp+6Eh] [rbp-92h]
char v498; // [rsp+6Fh] [rbp-91h]
char v499; // [rsp+70h] [rbp-90h]
char v500; // [rsp+71h] [rbp-8Fh]
char v501; // [rsp+72h] [rbp-8Eh]
char v502; // [rsp+73h] [rbp-8Dh]
char v503; // [rsp+74h] [rbp-8Ch]
char v504; // [rsp+75h] [rbp-8Bh]
char v505; // [rsp+76h] [rbp-8Ah]
char v506; // [rsp+77h] [rbp-89h]
char v507; // [rsp+78h] [rbp-88h]
char v508; // [rsp+79h] [rbp-87h]
char v509; // [rsp+7Ah] [rbp-86h]
char v510; // [rsp+7Bh] [rbp-85h]
char v511; // [rsp+7Ch] [rbp-84h]
char v512; // [rsp+7Dh] [rbp-83h]
char v513; // [rsp+7Eh] [rbp-82h]
char v514; // [rsp+7Fh] [rbp-81h]

printf("Give me Flag:", argv, envp);
__isoc99_scanf("%128s", &s);
if ( strlen(&s) == 128 )
{
v3 = 64538 * v429
+ 42900 * v428
+ 18329 * v427
+ 60412 * v426
+ 60307 * v425
+ 18530 * v424
+ 51121 * v423
+ 50282 * v422
+ 46722 * v421
+ 44487 * v420
+ 38419 * v419
+ 46190 * v418
+ 18243 * v417
+ 40252 * v416
+ 41765 * v415
+ 20132 * v414
+ 21211 * v413
+ 27153 * v412
+ 46112 * v411
+ 59321 * v410
+ 49412 * v409
+ 42549 * v408
+ 21824 * v407
+ 21129 * v406
+ 18066 * v405
+ 43022 * v404
+ 54055 * v403
+ 38707 * v402
+ 48128 * v401
+ 60067 * v400
+ 36126 * v399
+ 27472 * v398
+ 19052 * v397
+ 40829 * v396
+ 39355 * v395
+ 61052 * v394
+ 40870 * v393
+ 57038 * v392
+ 32494 * v391
+ 27938 * v390
+ 19407 * v389
+ 24781 * v388
+ 37921 * s;
v4 = 24771 * v471
+ 33991 * v470
+ 31417 * v469
+ 59818 * v468
+ 39294 * v467
+ 36226 * v466
+ 39486 * v465
+ 57710 * v464
+ 42226 * v463
+ 49425 * v462
+ 36772 * v461
+ 28905 * v460
+ 56121 * v459
+ 52847 * v458
+ 42837 * v457
+ 49578 * v456
+ 40181 * v455
+ 40989 * v454
+ 49484 * v453
+ 51756 * v452
+ 63499 * v451
+ 24443 * v450
+ 44983 * v449
+ 29121 * v448
+ 45920 * v447
+ 31270 * v446
+ 32548 * v445
+ 42180 * v444
+ 28781 * v443
+ 20664 * v442
+ 31970 * v441
+ 37429 * v440
+ 61803 * v439
+ 33044 * v438
+ 56440 * v437
+ 37835 * v436
+ 32992 * v435
+ 52454 * v434
+ 65272 * v433
+ 37799 * v432
+ 50401 * v431
+ 31920 * v430
+ v3;
v5 = 48499 * v513
+ 18203 * v512
+ 65067 * v511
+ 30665 * v510
+ 58990 * v509
+ 37148 * v508
+ 61681 * v507
+ 51316 * v506
+ 64090 * v505
+ 57189 * v504
+ 58206 * v503
+ 52880 * v502
+ 56821 * v501
+ 21676 * v500
+ 28817 * v499
+ 20060 * v498
+ 24492 * v497
+ 52094 * v496
+ 63505 * v495
+ 57244 * v494
+ 50929 * v493
+ 61554 * v492
+ 51708 * v491
+ 65257 * v490
+ 37567 * v489
+ 54352 * v488
+ 55426 * v487
+ 49466 * v486
+ 28952 * v485
+ 47589 * v484
+ 22287 * v483
+ 49762 * v482
+ 58791 * v481
+ 30764 * v480
+ 40171 * v479
+ 26026 * v478
+ 31717 * v477
+ 54297 * v476
+ 53803 * v475
+ 62356 * v474
+ 37562 * v473
+ 47359 * v472
+ v4;
if ( v5 + 33908 * v514 == 451221610 )
{
............
if ( v380 + 48903 * v514 == 428074321 )
{
v381 = 18255 * v429 + 27862 * v428 + 49507 * v427 + 50734 * v426 + 46584 * v425 + 22147 * v424 + 37539 * v423 + 47096 * v422 + 46464 * v421 + 36058 * v420 + 22895 * v419 + 41196 * v418 + 56603 * v417 + 54009 * v416 + 31454 * v415 + 23228 * v414 + 39219 * v413 + 54012 * v412 + 40791 * v411 + 60791 * v410 + 60818 * v409 + 57486 * v408 + 46241 * v407 + 24079 * v406 + 40128 * v405 + 47273 * v404 + 40612 * v403 + 32341 * v402 + 20015 * v401 + 38073 * v400 + 41230 * v399 + 61648 * v398 + 33734 * v397 + 61659 * v396 + 61614 * v395 + 52377 * v394 + 46854 * v393 + 21778 * v392 + 56660 * v391 + 63546 * v390 + 28059 * v389 + 23740 * v388 + 51085 * s;
v382 = 32419 * v471 + 25641 * v470 + 45499 * v469 + 19322 * v468 + 43032 * v467 + 23307 * v466 + 55448 * v465 + 53137 * v464 + 28623 * v463 + 18253 * v462 + 22115 * v461 + 49428 * v460 + 53125 * v459 + 55383 * v458 + 33400 * v457 + 56702 * v456 + 26964 * v455 + 61361 * v454 + 61475 * v453 + 24641 * v452 + 44331 * v451 + 45772 * v450 + 26200 * v449 + 16929 * v448 + 54818 * v447 + 51368 * v446 + 53472 * v445 + 32905 * v444 + 29339 * v443 + 46501 * v442 + 41223 * v441 + 51734 * v440 + 28049 * v439 + 29015 * v438 + 21595 * v437 + 61661 * v436 + 38454 * v435 + 42127 * v434 + 20790 * v433 + 46685 * v432 + 59201 * v431 + 18163 * v430 + v381;
v383 = 59175 * v513 + 39108 * v512 + 47897 * v511 + 30517 * v510 + 48502 * v509 + 21234 * v508 + 16881 * v507 + 33497 * v506 + 44346 * v505 + 34046 * v504 + 62689 * v503 + 61793 * v502 + 39949 * v501 + 51645 * v500 + 45006 * v499 + 30211 * v498 + 36412 * v497 + 50291 * v496 + 61936 * v495 + 24289 * v494 + 36906 * v493 + 39057 * v492 + 37973 * v491 + 38451 * v490 + 44004 * v489 + 36870 * v488 + 41842 * v487 + 56352 * v486 + 44525 * v485 + 55182 * v484 + 61692 * v483 + 22202 * v482 + 46291 * v481 + 43770 * v480 + 33996 * v479 + 16488 * v478 + 41249 * v477 + 30433 * v476 + 19083 * v475 + 64629 * v474 + 39094 * v473 + 20548 * v472 + v382;
if ( v383 + 48644 * v514 == 436619163 )
{
v384 = 20405 * v429 + 55744 * v428 + 53951 * v427 + 58954 * v426 + 58301 * v425 + 43146 * v424 + 50020 * v423 + 57986 * v422 + 32136 * v421 + 54559 * v420 + 36067 * v419 + 55753 * v418 + 52141 * v417 + 19801 * v416 + 51943 * v415 + 52352 * v414 + 59995 * v413 + 61920 * v412 + 21345 * v411 + 36243 * v410 + 24006 * v409 + 57833 * v408 + 60630 * v407 + 26409 * v406 + 55315 * v405 + 55536 * v404 + 56726 * v403 + 35936 * v402 + 52089 * v401 + 23346 * v400 + 37583 * v399 + 28011 * v398 + 63252 * v397 + 45544 * v396 + 31278 * v395 + 53351 * v394 + 59214 * v393 + 56389 * v392 + 21264 * v391 + 43663 * v390 + 50056 * v389 + 29807 * v388 + 54629 * s;
v385 = 34777 * v471 + 31197 * v470 + 30616 * v469 + 36452 * v468 + 26811 * v467 + 36716 * v466 + 56574 * v465 + 26609 * v464 + 61561 * v463 + 53940 * v462 + 42728 * v461 + 47488 * v460 + 27142 * v459 + 43536 * v458 + 50520 * v457 + 23098 * v456 + 26887 * v455 + 20179 * v454 + 50829 * v453 + 52275 * v452 + 46516 * v451 + 63611 * v450 + 59165 * v449 + 64759 * v448 + 38581 * v447 + 59893 * v446 + 30951 * v445 + 40268 * v444 + 49167 * v443 + 21028 * v442 + 51890 * v441 + 46565 * v440 + 17053 * v439 + 62330 * v438 + 51110 * v437 + 47835 * v436 + 62399 * v435 + 57967 * v434 + 24624 * v433 + 64106 * v432 + 25896 * v431 + 50027 * v430 + v384;
v386 = 43090 * v513 + 60146 * v512 + 58416 * v511 + 17103 * v510 + 39414 * v509 + 32649 * v508 + 45967 * v507 + 20158 * v506 + 37299 * v505 + 20670 * v504 + 46301 * v503 + 31897 * v502 + 62016 * v501 + 63284 * v500 + 32156 * v499 + 40720 * v498 + 36471 * v497 + 27360 * v496 + 50777 * v495 + 25651 * v494 + 64743 * v493 + 59790 * v492 + 22455 * v491 + 64238 * v490 + 37757 * v489 + 60849 * v488 + 30086 * v487 + 34636 * v486 + 18797 * v485 + 33985 * v484 + 46073 * v483 + 24947 * v482 + 48851 * v481 + 24773 * v480 + 41489 * v479 + 17636 * v478 + 32373 * v477 + 35731 * v476 + 19021 * v475 + 17532 * v474 + 63794 * v473 + 44087 * v472 + v385;
if ( v386 + 55482 * v514 == 452784657 )
{
puts("YOU GET IT! YEEEEEAAA");
exit(0);
}
.........

观察一下很容易发现,这就是个简单的矩阵乘法,算AX=b,解起来很轻松,但是数据是在太多了,只能写脚本处理一下,本着简单使用的原则,把所有的数字找出来然后提取大于515的部分,就是所有用到的数,观察一下发现每一个处理变量的位置都是不变的,所以对应的数据的位置也是不变的,所以按照顺序提取一下就行了,最后再调整一下顺序就出来了

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
import re
import numpy as np

s = ""
with open('bigequition.txt', 'r+') as f:
s += f.read()
num = re.findall('\d+', s)

nums = []
for i in num:
tmp = int(i)
if tmp > 515:
nums.append(tmp)

arr = []
result = []
for i in range(128):
t_tmp = []
for j in range(128):
t_tmp.append(nums[129 * i + j])
arr.append(t_tmp)
result.append(nums[129 * i + 128])
# print(arr)
# print(result)
A = np.array(arr)
B = np.array([result])
b = np.transpose(B)
A_inv = np.linalg.inv(A)
x = np.dot(A_inv, b)
x = np.rint(x)
flag = ""
for i in range(43):
flag += chr(int(x[42 - i]))
for i in range(42):
flag += chr(int(x[43 + 41 - i]))
for i in range(42):
flag += chr(int(x[43 + 42 + 41 - i]))
flag += chr(int(x[-1]))
print(flag)

# flag{Soooo000_LooOOOOOOOOggO99g99_s1muLtaNeOus_EEEQuat10n5_Y0UUUUUUuuu_cAA44AANNnnN_SOOOOOOLVE_IT17TT11771ITIT!!!_8ShotDshP90ab}

本来没想到这题这么简单,放假玩了一天晚上睡前才看了一眼,错过一血,错亿

HouseplantCTF-wp 网鼎杯-wp

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×