1. 题目背景
给定一个特殊编码的字符串 OoDVP4LtFm7lKnHk+JDrJo2jNZDROl/1HH77H5Xv
,要求通过分析解密出隐藏的Flag。已知该加密方式采用了Base64编码的变种,并包含字符位置偏移操作。
2. 加密分析
2.1 加密逻辑推断
通过逆向分析代码可知加密过程包含两个阶段:
-
ROT-n偏移:对标准Base64字符进行循环位移操作
-
例如:当n=14时,字符'A'→'O'(ASCII位置0→14)
-
-
Base64编码:使用标准Base64编码(但存在实现缺陷)
2.2 关键特征识别
-
编码表异常:题目使用的编码表包含65个字符(含"="),但实际运算时取模64
-
填充问题:可能省略标准Base64的"="填充符
-
位移方向:实际加密为逆向位移,但题目代码使用正向位移尝试破解
3. 解密思路
3.1 核心原理
由于不知道具体的偏移量n,采用暴力破解法遍历所有可能的偏移量(0-63),通过以下步骤实现:
-
对每个字符进行反向位移操作
-
补全Base64填充符"="
-
尝试标准Base64解码
3.2 数学验证
假设原字符在表中的索引为 i
,加密后索引为:
encrypted_index = (i - n) % 64
解密时需计算:
original_index = (encrypted_index + n) % 64
4. 解密过程
4.1 代码实现(带注释)
import base64
# 注意:原始编码表错误地包含等号"="
base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
encrypted_str = 'OoDVP4LtFm7lKnHk+JDrJo2jNZDROl/1HH77H5Xv'
for offset in range(64): # 遍历所有可能的偏移量
decoded_str = ""
# 对每个字符进行位移操作
for c in encrypted_str:
original_pos = base64_table.index(c)
# 关键步骤:反向计算原始位置
new_pos = (original_pos + offset) % 64
decoded_str += base64_table[new_pos]
# 补全Base64填充
if len(decoded_str) % 4 != 0:
decoded_str += '=' * (4 - len(decoded_str) % 4)
# 尝试解码
try:
result = base64.b64decode(decoded_str).decode('utf-8')
print(f"Offset {offset:2d}: {result}")
except:
continue
4.2 关键参数说明
参数 | 说明 |
---|---|
base64_table | 异常编码表(含65字符) |
offset范围 | 0-63(因模64运算) |
填充处理 | 自动补"="使长度为4的倍数 |
异常处理 | 跳过解码失败的offset |
5. 结果验证
5.1 成功输出
sdctf{OBscUr1ty_a1nt_s3CURITy}
修改一下
NSSCTF{OBscUr1ty_a1nt_s3CURITy}