输入一段字符串,然后用输入的字符串在下图进行一系列运算后,将运算的结果存入v39之中,然后进行一个sbox的初始化,和输入没有半毛钱关系,每次运行都是相同的数,所以可以动调然后取出。
接着用sbox和我们的输入进行了一系列运算,将结果存进int类型的v11中。
接下来是一个常规的字符串转数字存入内存的函数,不过这里的ascii大于0x39的字符是减55后存入内存。
然后下图的最下面的if判断需要满足,否则game over。向上看do while,发现和我们的输入有关的只有v39,也就是上面的那个运算的结果
这里通过爆破得出了v17的范围
只有7,这就好办了。爆破input前三个数就行。这里注意此处的input已经被之前的string_into_memory函数转化过了,爆破固定的范围即可。
得出一堆满足的数,随便选一个0AD填进去第一关就过了
这里相当于告诉你后面几位是多少了,不做赘述,加上后现在已知的flag是0ADKCTF
又是一个运算
v19是v17+2,v17就是刚刚爆破出来结果全是7的那个,所以可以得知循环的次数固定是9次。此处进行运算的是我们输入的0ADKCTF的后九位。假设输入为0ADKCTF123456789时,这里的v41[v22]最开始指向的就是1
当v24%v36不等于0时会失败。注意这里循环一次只需要取一次余,不用将前面的余全部取一遍。
比如输入123456789,先判断1%1==0,然后判断12%2==0,然后判断123%3==0,依次类推。
写了个脚本爆破,但是发现后面还有个限制,这里是从小到大排序我们刚刚输入的九个数
然后这里是比较,必须1到9全部出现。所以刚刚的爆破还要加个限制。
脚本如下
发现只能爆破出一个数381654729
这个函数不知道有啥用,我直接f8发现没事就没看了
最后一关就是要满足这个v34等于这个数,查看v34交叉引用,发现是和很上面的sbox运算有关
我们的前三位爆破出了很多数,我是随便选了一个就过的,看来这里是作为前三位的限制。
因为我们只有前三位不是唯一的,只需要爆破前三位就行。脚本如下
得到前三位是421,所以最终的序列号是421KCTF381654729
题出的很有意思,像闯关游戏一样hhh
然后和第一名差了2秒,有点悲伤(
using namespace std;
int
v3;
/
/
ebx
int
len
;
/
/
esi
char v5;
/
/
cl
int
v6;
/
/
edi
char
*
v7;
/
/
esi
char v8;
/
/
ch
char v9;
/
/
cl
char v10;
/
/
dl
int
v11;
/
/
ecx
int
i;
/
/
edx
int
v13;
/
/
ecx
int
v14;
/
/
esi
int
v15;
/
/
eax
int
j;
/
/
edx
int
v17;
/
/
edi
int
v18;
/
/
esi
int
v19;
/
/
edi
int
v20;
/
/
esi
int
v21;
/
/
eax
int
v22;
/
/
ecx
int
v23;
/
/
eax
int
v24;
/
/
ecx
int
v25;
/
/
eax
int
v26;
/
/
edx
int
v27;
/
/
ecx
char v28;
/
/
bl
char v29;
/
/
bh
int
v30;
/
/
ecx
char
*
v31;
/
/
edi
int
v33[
200
];
/
/
[esp
+
10h
] [ebp
-
368h
]
int
v34;
/
/
[esp
+
330h
] [ebp
-
48h
]
int
v35;
/
/
[esp
+
334h
] [ebp
-
44h
]
int
v36;
/
/
[esp
+
338h
] [ebp
-
40h
]
int
v37;
/
/
[esp
+
33Ch
] [ebp
-
3Ch
]
int
v38;
/
/
[esp
+
340h
] [ebp
-
38h
]
char v39;
/
/
[esp
+
347h
] [ebp
-
31h
]
char
input
[
6
];
/
/
[esp
+
348h
] [ebp
-
30h
] BYREF
char v41[
38
];
/
/
[esp
+
34Eh
] [ebp
-
2Ah
] BYREF
int
main()
{
for
(
int
i
=
0
; i <
=
0xff
; i
+
+
)
{
v13
=
i;
v15
=
v13;
for
(j
=
1
; j <
200
;
+
+
j)
{
if
((v15 &
1
) !
=
0
)
/
/
奇数
*
3
+
1
v15
=
3
*
v15
+
1
;
else
v15 >>
=
1
;
/
/
偶数右移
1
v33[j]
=
v15;
}
v17
=
v33[
198
] | v33[
197
] | v33[
196
];
cout << v17 << endl;
}
}
using namespace std;
int
v3;
/
/
ebx
int
len
;
/
/
esi
char v5;
/
/
cl
int
v6;
/
/
edi
char
*
v7;
/
/
esi
char v8;
/
/
ch
char v9;
/
/
cl
char v10;
/
/
dl
int
v11;
/
/
ecx
int
i;
/
/
edx
int
v13;
/
/
ecx
int
v14;
/
/
esi
int
v15;
/
/
eax
int
j;
/
/
edx
int
v17;
/
/
edi
int
v18;
/
/
esi
int
v19;
/
/
edi
int
v20;
/
/
esi
int
v21;
/
/
eax
int
v22;
/
/
ecx
int
v23;
/
/
eax
int
v24;
/
/
ecx
int
v25;
/
/
eax
int
v26;
/
/
edx
int
v27;
/
/
ecx
char v28;
/
/
bl
char v29;
/
/
bh
int
v30;
/
/
ecx
char
*
v31;
/
/
edi
int
v33[
200
];
/
/
[esp
+
10h
] [ebp
-
368h
]
int
v34;
/
/
[esp
+
330h
] [ebp
-
48h
]
int
v35;
/
/
[esp
+
334h
] [ebp
-
44h
]
int
v36;
/
/
[esp
+
338h
] [ebp
-
40h
]
int
v37;
/
/
[esp
+
33Ch
] [ebp
-
3Ch
]
int
v38;
/
/
[esp
+
340h
] [ebp
-
38h
]
char v39;
/
/
[esp
+
347h
] [ebp
-
31h
]
char
input
[
6
];
/
/
[esp
+
348h
] [ebp
-
30h
] BYREF
char v41[
38
];
/
/
[esp
+
34Eh
] [ebp
-
2Ah
] BYREF
int
main()
{
for
(
int
i
=
0
; i <
=
0xff
; i
+
+
)
{
v13
=
i;
v15
=
v13;
for
(j
=
1
; j <
200
;
+
+
j)
{
if
((v15 &
1
) !
=
0
)
/
/
奇数
*
3
+
1
v15
=
3
*
v15
+
1
;
else
v15 >>
=
1
;
/
/
偶数右移
1
v33[j]
=
v15;
}
v17
=
v33[
198
] | v33[
197
] | v33[
196
];
cout << v17 << endl;
}
}
using namespace std;
int
v3;
/
/
ebx
int
len
;
/
/
esi
char v5;
/
/
cl
int
v6;
/
/
edi
char
*
v7;
/
/
esi
char v8;
/
/
ch
char v9;
/
/
cl
char v10;
/
/
dl
int
v11;
/
/
ecx
int
i;
/
/
edx
int
v13;
/
/
ecx
int
v14;
/
/
esi
int
v15;
/
/
eax
int
j;
/
/
edx
int
v17;
/
/
edi
int
v18;
/
/
esi
int
v19;
/
/
edi
int
v20;
/
/
esi
int
v21;
/
/
eax
int
v22;
/
/
ecx
int
v23;
/
/
eax
int
v24;
/
/
ecx
int
v25;
/
/
eax
int
v26;
/
/
edx
int
v27;
/
/
ecx
char v28;
/
/
bl
char v29;
/
/
bh
int
v30;
/
/
ecx
char
*
v31;
/
/
edi
int
v33[
200
];
/
/
[esp
+
10h
] [ebp
-
368h
]
int
v34;
/
/
[esp
+
330h
] [ebp
-
48h
]
int
v35;
/
/
[esp
+
334h
] [ebp
-
44h
]
int
v36;
/
/
[esp
+
338h
] [ebp
-
40h
]
int
v37;
/
/
[esp
+
33Ch
] [ebp
-
3Ch
]
int
v38;
/
/
[esp
+
340h
] [ebp
-
38h
]
char v39;
/
/
[esp
+
347h
] [ebp
-
31h
]
char
input
[
6
];
/
/
[esp
+
348h
] [ebp
-
30h
] BYREF
char v41[
38
];
/
/
[esp
+
34Eh
] [ebp
-
2Ah
] BYREF
int
main()
{
for
(
int
j
=
0
; j <
50
; j
+
+
)
{
for
(
int
z
=
0
; z <
50
; z
+
+
)
{
for
(
int
w
=
0
; w <
50
; w
+
+
)
{
if
((j ^ z ^ w)
=
=
7
)
{
if
(j >
9
)
{
cout << (char)(j
+
55
);
}
else
{
cout << (char)(j
+
48
);
}
if
(z >
9
)
{
cout << (char)(z
+
55
);
}
else
{
cout << (char)(z
+
48
);
}
if
(w >
9
)
{
cout << (char)(w
+
55
);
}
else
{
cout << (char)(w
+
48
);
}
cout << endl;
}
}
}
}
}
using namespace std;
int
v3;
/
/
ebx
int
len
;
/
/
esi
char v5;
/
/
cl
int
v6;
/
/
edi
char
*
v7;
/
/
esi
char v8;
/
/
ch
char v9;
/
/
cl
char v10;
/
/
dl
int
v11;
/
/
ecx
int
i;
/
/
edx
int
v13;
/
/
ecx
int
v14;
/
/
esi
int
v15;
/
/
eax
int
j;
/
/
edx
int
v17;
/
/
edi
int
v18;
/
/
esi
int
v19;
/
/
edi
int
v20;
/
/
esi
int
v21;
/
/
eax
int
v22;
/
/
ecx
int
v23;
/
/
eax
int
v24;
/
/
ecx
int
v25;
/
/
eax
int
v26;
/
/
edx
int
v27;
/
/
ecx
char v28;
/
/
bl
char v29;
/
/
bh
int
v30;
/
/
ecx
char
*
v31;
/
/
edi
int
v33[
200
];
/
/
[esp
+
10h
] [ebp
-
368h
]
int
v34;
/
/
[esp
+
330h
] [ebp
-
48h
]
int
v35;
/
/
[esp
+
334h
] [ebp
-
44h
]
int
v36;
/
/
[esp
+
338h
] [ebp
-
40h
]
int
v37;
/
/
[esp
+
33Ch
] [ebp
-
3Ch
]
int
v38;
/
/
[esp
+
340h
] [ebp
-
38h
]
char v39;
/
/
[esp
+
347h
] [ebp
-
31h
]
char
input
[
6
];
/
/
[esp
+
348h
] [ebp
-
30h
] BYREF
char v41[
38
];
/
/
[esp
+
34Eh
] [ebp
-
2Ah
] BYREF
int
main()
{
for
(
int
j
=
0
; j <
50
; j
+
+
)
{
for
(
int
z
=
0
; z <
50
; z
+
+
)
{
for
(
int
w
=
0
; w <
50
; w
+
+
)
{
if
((j ^ z ^ w)
=
=
7
)
{
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)