0%

[羊城杯 2020]easyre WP

2025-09-04 20:00By
Lentinel
Base64自定义逻辑C

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}

还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论

加载中...