📌 题目信息
| 项目 | 内容 |
|---|---|
| 题目名称 | [ACTF新生赛2020]base64隐写 |
| 题目来源 | BUUCTF(ACTF新生赛 2020) |
| 题目类型 | Crypto(密码学)/ MISC |
| 子分类 | Base系列(Base64隐写) |
| 考点 | Base64编码原理、隐写术、二进制位操作 |
| 难度 | ⭐⭐ |
| 最终 Flag | flag{6aseb4_f33!} |
🛠️ 使用工具
- Python —— 编写Base64隐写解码脚本(注意:部分脚本需Python 2环境)
📝 解题思路
题目名为“base64隐写”,附件解压后得到一个文本文件(
ComeOn!.txt)和一个二维码图片(hint.png)。文本中每行都是一段Base64编码,直接解码只能得到无意义的内容。真正的Flag隐藏在Base64编码的填充位中——这就是Base64隐写的核心原理。
第 1 步:Base64隐写原理(为什么能藏信息?)
Base64编码将每3个字节(24位)转换成4个6位字符。当原始数据不足3字节时,会进行补位:
- 剩余2字节(16位):补8个0凑成24位,最后1个字符用
=填充,倒数第2个字符的低2位是多余的(可用来藏信息) - 剩余1字节(8位):补16个0凑成24位,最后2个字符用
=填充,倒数第3个字符的低4位是多余的(可用来藏信息)
💡 关键点:解码时,这些“多余位”会被忽略。因此,修改这些位不会影响解码结果,但可以用来隐藏额外数据。
第 2 步:下载并解压附件
下载题目附件,解压后得到两个文件:
ComeOn!.txt—— 包含大量Base64编码的文本文件,每行一个编码hint.png—— 二维码图片(扫描后是“中南极光网安实验室”等字样,对解题无直接帮助)
第 3 步:使用Python脚本提取隐写信息
将以下Python脚本保存为 decode.py,与 ComeOn!.txt 放在同一目录下运行:
import base64
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('ComeOn!.txt', 'rb') as f:
flag = ''
bin_str = ''
for line in f.readlines():
stegb64 = str(line, "utf-8").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) -
b64chars.index(rowb64.replace('=', '')[-1]))
equalnum = stegb64.count('=') # 等号个数
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
for i in range(0, len(bin_str), 8):
flag += chr(int(bin_str[i:i+8], 2))
print(flag)

⚠️ 注意:部分版本的脚本需要用 Python 2 运行,并确保文件编码为
utf-8。如果运行报错,可尝试将open的'rb'模式改为'r',或调整字符串编码方式。
脚本运行后输出:
flag{6aseb4_f33!}
第 4 步:另一种解码脚本(逐行提取法)
如果上述脚本无法运行,也可以使用以下更直观的脚本:
base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
bin_str = ""
with open('./ComeOn!.txt', 'r') as f:
lines = f.read().splitlines()
for line in lines:
if line.find("==") > 0:
# 取倒数第3个字符,取低4位
temp = bin((base64_table.index(line[-3]) & 15))[2:]
bin_str += "0" * (4 - len(temp)) + temp
elif line.find("=") > 0:
# 取倒数第2个字符,取低2位
temp = bin((base64_table.index(line[-2]) & 3))[2:]
bin_str += "0" * (2 - len(temp)) + temp
flag = ""
for i in range(0, len(bin_str), 8):
flag += chr(int(bin_str[i:i+8], 2))
print(flag)
第 5 步:提交Flag
运行脚本得到的 flag{6aseb4_f33!} 已经是 flag{} 格式,直接提交即可。
⚠️ 注意:部分Writeup显示原始解出结果为
ACTF{6aseb4_f33!},BUUCTF平台要求提交时需将前缀改为flag{}。
🏁 最终 Flag
flag{6aseb4_f33!}
【Base系列】ACTF新生赛2020 base64隐写&spm=1001.2101.3001.5002&articleId=163751055&d=1&t=3&u=b76e8277a3f9402593a98791755e0a64)
229

被折叠的 条评论
为什么被折叠?



