直接看到主函数

关键函数位 17 行的 sub_401080,我们点进去看看

这个函数又可以分为三个部分,第一个部分是 sub_401000 函数,第三部分是 sub_401030,第二部分就是这中间的部分,我是先点开了 byte_40E0A0 这个数组,点进去一看发现了 base64 的编码表,再回头看第二部分的加密,就可以确定这是 base 编码了

然后再看看第一部分的函数

发现这里对 base64 的编码表做了点手脚,把里面的位置调换了一下

在看第三部分 sub_401030,这个函数将编码后的 flag 的大小写互换了一下

总结一下就是将 flag 用换了表的 base64 编码一下,然后再把大小写互换一下即可,然后我们再找一下密文,密文就是主函数中的 byte_40E0E4 也就是 zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9

先写一个大小写互换和得出新表的脚本吧

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
a = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
b = ''
for i in range(len(a)):
if a[i] >= 'A' and a[i] <= 'Z':
b += chr(ord(a[i]) + 32)
if a[i] >= 'a' and a[i] <= 'z':
b += chr(ord(a[i]) - 32)
if a[i] <= '9' and a[i] >= '0':
b += a[i]
print(b)

v1 = ''
result = 6
part_base64 = 'ABCDEFGHIJKLMNO' # byte_40E0A0
base64 = 'KLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' # byte_40E0AA
base1 = list(part_base64)
base2 = list(base64)
for i in range(result, 15):
v1 = base2[result]
base2[result] = base1[result]
base1[result] = v1
result += 1
a = ''.join(base1 + base2[5:])
print(a)

跑出来的结果如下,上面是大小写互换后的密文,下面是新表

最后我们再用一个脚本把新的 base64 编码表放进去,再来解码这个密文就可以得到 flag 啦~

得到 flag {bAse64_h2s_a_Surprise}