kashiCTF - Secret of Mahabharata (Crypto)¶
题目信息¶
- 比赛: kashiCTF
- 题目: Secret of Mahabharata
- 类别: Crypto
- 难度: 简单
- 题目描述:
- 原文: 自伟大的摩诃婆罗多大战以来,一条秘密信息便代代相传。传说每隔64年,守护这条秘密的人都会重新加密信息,以防有人滥用其力量。这条信息已历经3136年的历史,从公元前3136年的俱卢之野战场一直流传到公元纪元之初。
- 提交前请尝试将 flag 格式更改为 kashiCTF {...}。
- 附件:
secret_message.txt - 附件链接: 下载附件 · 仓库位置
- Flag格式: kashiCTF{...}
- 状态: 已解
Flag¶
kashiCTF{th3_s3cr3t_0f_mah4bh4r4t4_fr0m_3136_BCE}
解题过程¶
1. 分析题目信息¶
题目描述中包含关键数值:
| 信息 | 含义 |
|---|---|
| 每隔 64 年重新加密 | 暗示 Base64 编码 |
| 历经 3136 年 | 总时间跨度 |
| 3136 ÷ 64 = 49 | 编码总次数 |
打开附件 secret_message.txt,文件大小约 59 MB,内容为纯 Base64 字符串(Vm0wd2QyUXlVWGxW...),无换行、无其他格式——典型的多层 Base64 编码特征。
2. 计算编码层数¶
从题目描述直接计算:
\[
\text{编码次数} = \frac{3136}{64} = 49 \text{ 次}
\]
每次 Base64 编码会使数据膨胀约 \(\frac{4}{3}\) 倍。反过来,49 次解码后数据量会急剧缩小:
- 第 1 次解码:59 MB → ~44 MB
- 第 10 次解码:~3.4 MB
- 第 25 次解码:~46 KB
- 第 49 次解码:45 bytes(最终明文)
3. 循环解码获取 Flag¶
使用 shell 脚本循环解码 49 次:
cp secret_message.txt /tmp/msg.txt
for i in $(seq 1 49); do
base64 -d /tmp/msg.txt > /tmp/msg_dec.txt
mv /tmp/msg_dec.txt /tmp/msg.txt
done
cat /tmp/msg.txt
输出结果:
flag{th3_s3cr3t_0f_mah4bh4r4t4_fr0m_3136_BCE}
4. 转换 Flag 格式¶
根据题目要求,将 flag{...} 格式改为 kashiCTF{...}:
kashiCTF{th3_s3cr3t_0f_mah4bh4r4t4_fr0m_3136_BCE}
攻击链/解题流程总结¶
题目描述提取关键数字(64/3136) → 计算编码次数(49次) → 循环 Base64 解码 → 替换 flag 格式 → Flag
漏洞分析 / 机制分析¶
根因¶
- 利用 Base64 编码的可逆性与无密钥特性,多次编码并不增加安全性,只是增加数据体积
- 题目通过历史故事暗示编码方式(64 → Base64)和编码次数(3136 ÷ 64 = 49)
影响¶
- Base64 是编码而非加密,无论嵌套多少层都可以无密钥还原原文
- 唯一的"保护"是文件体积膨胀(45 bytes 原文膨胀到约 59 MB)
知识点¶
- Base64 编码:每次编码将 3 字节映射为 4 个 ASCII 字符,数据膨胀约 33%
- 编码 vs 加密:Base64 是可逆编码,不提供任何安全性保障;多层编码不等于加密
- CTF 题目信息提取:题目描述中的数字(64、3136)通常是解题关键线索
使用的工具¶
- base64 (coreutils) — 命令行 Base64 解码
- Go / Python — 编写自动化循环解码脚本
脚本归档¶
命令行提取关键数据(无 GUI)¶
# 一行命令循环解码 49 次 Base64
cp secret_message.txt /tmp/msg.txt && for i in $(seq 1 49); do base64 -d /tmp/msg.txt > /tmp/msg_dec.txt && mv /tmp/msg_dec.txt /tmp/msg.txt; done && cat /tmp/msg.txt