Problem: [羊城杯 2020]easyre
思路
程序整体流程:输入字符串 → encode_one → encode_two → encode_three → 与目标串 Str2 比对。
encode_one:实现的是标准 Base64 编码,输入 38 字节 → 输出 52 字符(带 = 填充)。
encode_two:对 52 字符做 分段置换,规则为每段 13 个字符:
out[0..12] = in[26..38]
out[13..25] = in[0..12]
out[26..38] = in[39..51]
out[39..51] = in[13..25]
encode_three:对字母和数字进行 Caesar +3 变换(A–Z、a–z、0–9 循环),非字母数字不变。
逆向时:先对目标串 Str2 做 Caesar -3 → 逆置换还原 Base64 串 → Base64 解码 → 得到原始 flag。
EXP
import base64
Str2 = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
def rev_caesar(s):
out = []
for ch in s:
if 'A' <= ch <= 'Z':
out.append(chr((ord(ch)-65-3)%26 + 65))
elif 'a' <= ch <= 'z':
out.append(chr((ord(ch)-97-3)%26 + 97))
elif '0' <= ch <= '9':
out.append(chr((ord(ch)-48-3)%10 + 48))
else:
out.append(ch)
return ''.join(out)
# 1) 逆 encode_three
y = rev_caesar(Str2)
# 2) 逆 encode_two
x = ['?']*52
x[26:39] = list(y[0:13])
x[0:13] = list(y[13:26])
x[39:52] = list(y[26:39])
x[13:26] = list(y[39:52])
b64 = ''.join(x)
# 3) 逆 encode_one
flag = base64.b64decode(b64).decode()
print("flag:", flag)
运行结果:
flag: GWHT{672cc4778a38e80cb362987341133ea2}
总结
本题考查了 编码与简单加密组合逆向:
Base64 编码机制理解;
字符串分段置换与逆向思路;
Caesar 移位密码的实现与还原。
最终通过逆向还原得到 flag:
GWHT{672cc4778a38e80cb362987341133ea2}

加载中...