解题思路

简单浏览下程序思路,可以发现程序的输入,但程序的结果比较过程则没有发现。

main

sub_401670

sub_402770

通过网上搜索,在sub_402770的函数中Block部分应该也是一个函数,我猜测具体过程是由前一句sub_401C40函数生成的,因此直接在这下断点,直接动态调试。

程序的比较过程还是比较明显的,但还是调试了我半天,具体过程就不贴图了。

第一个过程

对input[i]进行异或4,然后当 i % 3 == 1时,还将input[i]与一串字符串第(3 * i)位异或(但根据该字符串来进行解题时,出现的结果不太对,因此我直接记录进行异或的字符,直接异或了)

第二个过程

对sub_4017B0函数生成的字符串进行处理。

sub_4017B0

由于程序的进行,处理后的字符串可以直接读取,因此不用管过程,直接得到结果。

str1 = "e4bdtRV02"

后面的字符被第十位的 0 截断了,因此只有9位了。

第三个过程

将变化后的input[i]与sub_401BD0(i)所得到的返回值 + 2 进行异或。

sub——401BD0

同时如果input的前九位与str1的前九位相加。

调试得到的第三个过程

解题脚本

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
def getnum(a1):
if a1 == 0:
return 12
elif a1 == 1:
return 11
else:
return 10


str1 = "e4bdtRV02"
str = "flag{where is tom}flag{My cheese}flag{i miss tom}"
str2 = "gsleg"
strrrr = [0xD3, 0x38, 0xD1, 0xD3, 0x7B, 0xAD, 0xB3, 0x66, 0x71, 0x3A,
0x59, 0x5F, 0x5F, 0x2D, 0x73]
flag = []
for i in range(15):
if i < 9:
flag.append((strrrr[i] - ord(str1[i])) ^ getnum(i % 3))
else:
flag.append((strrrr[i] ^ getnum(i % 3)))
t = 0
for i in range(15):
if i % 3 == 1:
flag[i] ^= ord(str2[t])
t += 1
flag[i] ^= 4
for i in flag:
print(chr(i), end="")