Problem: [SDCTF 2022]Case64AR
思路
- 解题大致思路
首先,分析题目,还是英文,翻译过来意思就是这次的加密是现代加密和古典加密方法的结合(感觉这明明是Crypto的题,怎么放到misc里面,但是这是misc,也算挺合理),标题是Case64AR,显然有base64,然后C开头的古典加密算法,既然是misc,肯(坑)定不会出很鲜为人知的,所以大概率是凯撒加密。至于后面的AR,我承认我想多了,一开始还以为会不会是AES(服了自己)
那么知道是凯撒密码和base64了,但是怎么结合在一起,这又是一个值得思考的问题。
于是,开始观察密文,发现密文有明显的base64编码的特点,并根据名字Case64,大胆猜想,是先凯撒加密后进行base64,于是我先将密文base64解码,然后穷举所有可能的凯撒加密,但是结果并不如意(每一个打印出来都看不得)。正当我百思不得其解时,我发现我刚刚的思路更是猜成一种顺序加密,而不是描述中的“融合”,所有我在想base64编码中,哪一步可以把凯撒加密结合进去,发现在base64中,替换标准表时可以加入偏移量,也就是在这加入凯撒加密,穷举所有偏移量,发现14时,可以成功打印出flag。
如果,难以理解的话,我举个例子:就比如明文是:"Hello, world!",那么正常base64编码的结果是:"SGVsbG8sIHdvcmxkIQ==",但是这里加入了偏移量(也就是凯撒加密),原来索引18对于标准表中的“S”,加入14偏移量后,索引就变成了32,那么这样就变成对于的“O”,那么最后就编码成“OUJqfJUq WVpbBuhxZGE==”。
EXP
- 具体攻击代码
import base64
# Base64 编码表
base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
# 加密的字符串
enc = 'OoDVP4LtFm7lKnHk+JDrJo2jNZDROl/1HH77H5Xv'
# 遍历所有可能的偏移量
for n in range(64):
dec = "" # 用于存储当前偏移量下的 Base64 编码结果
# 遍历密文中的每个字符
for char in enc:
# 找到字符在 Base64 编码表中的索引
i = base64_table.index(char)
# 计算新的索引,向后移动 offset 位
new_index = (i + n) % 64
# 根据新的索引找到对应的字符,并加入结果字符串
dec += base64_table[new_index]
try:
# 尝试解码 Base64,如果成功则打印结果
flag = base64.b64decode(dec).decode('utf-8')
print(f"偏移 {n}: {flag}")
except Exception:
# 如果 Base64 解码失败(无效编码字符串),跳过
print(f"偏移 {n}: Invalid Base64 string")
总结
- 对该题的考点总结
凯撒加密 base64
