2026.7.18(14)【Base系列】ACTF新生赛2020 base64隐写

📌 题目信息

项目内容
题目名称[ACTF新生赛2020]base64隐写
题目来源BUUCTF(ACTF新生赛 2020)
题目类型Crypto(密码学)/ MISC
子分类Base系列(Base64隐写)
考点Base64编码原理、隐写术、二进制位操作
难度⭐⭐
最终 Flagflag{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!}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值