# 主函数

思路很好理解,将输入的 flag 进行三次 encode 然后和 Str2 对比,一致则正确,我们分别看一下三个 encode 的作用

# encode_one

在 encode_one 中有一个 alphabet,其实就是编码表,很明显就是 base64 哈哈哈,所以这一个函数的作用就是给输入的 flag 进行一次 base64 编码

# encode_two

这一步是将 base64 编码后的 flag 进行一次分组,strncpy 函数的作用,以第一个为例,是将编码后的 flag 的 26 位开始数 13 个复制到 a3,也就是 26 到 39,以此类推就是 0-13,39-52,13-26

# encode_three

这一步是将分组完后的 flag 在进行一次算法加密,其实这就是凯撒加密,但比凯撒多了一步即 0-9 几个数字也进行了变化,48-57 就是 0-9 的 ASCII 码

# 总体思路

程序将我们输入的 flag 进行一次 base64 编码后,再 13 个 13 个为一组进行一次调换,然后在进行一次特殊的凯撒加密,最后在与 Str2 进行对比,Str2 就是进行了 3 次加密过后的结果,理清楚思路之后,我们反着来写个脚本就可以得到最初的 flag 了~

# 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64
a = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
flag = ''
for i in range(len(a)):
if ord(a[i]) > 47 and ord(a[i]) <= 57:
flag += chr((ord(a[i]) - 48 - 3) % 10 + 48) # 数字也要减三
elif ord(a[i]) > 96 and ord(a[i]) <= 122:
flag += chr((ord(a[i]) - 97 - 3) % 26 + 97)
elif ord(a[i]) > 64 and ord(a[i]) <= 90:
flag += chr((ord(a[i]) - 65 - 3) % 26 + 65)
else:
flag += a[i]
print(flag)
flag = flag[13:26] + flag[39:] + flag[:13] + flag[26:39]
print(base64.b64decode(flag))

得到 flag:GWHT{672cc4778a38e80cb362987341133ea2}

题目来源:BUUCTF 在线评测 (buuoj.cn)——[羊城杯 2020] easyre