ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Base64隐写解题记:从一张报错图片到CTF flag

Base64隐写解题记:从一张报错图片到CTF flag

1. 一张报错的图片,把我拽进了Base64隐写的坑

事情是这样的。某次CTF比赛线上赛阶段,杂项题里给了一个看起来平平无奇的图片链接。点开之后浏览器直接白屏,控制台报了一个格式错误——仔细一看,URL里的图片数据不是常规的data:image/png;base64,开头,而是data:image/png;base64,,注意,这里的分号是中文全角分号,而且 base64 和逗号之间多了一个空格。

我当时的第一反应是:出题人手滑了?但CTF题里从来没有真正的"手滑",每一个看似错误的细节,都可能是解题的钥匙。果然,把这段数据完整复制下来,去掉data:image/png;base64,这个前缀之后,剩下一大串Base64字符串。我用Python的base64.b64decode()去解码,得到了一串文件头是89504E47的PNG文件内容。写到本地再打开,图片能显示,但画面上只有一行小字:"flag不在这里,再看看别处吧。"

这就是典型的Base64隐写题开局。这道题来自河南省第二届金盾信安杯的CTF杂项方向,题面本身不复杂,但考察的知识点非常集中:Base64编码原理、PNG文件结构、隐写分析的基本思路。这篇文章我就把完整的解题过程、踩过的坑、以及这类题目的通用解法都梳理一遍,给准备打CTF杂项的朋友做个参考。

先说结论:这道题的核心考点有两个,一是识别出被伪装过的data:image/png;base64,前缀,二是对Base64字符串进行二次处理——包括可能的隐写位提取、图片尾部附加数据、或LSB隐写。我实际解出来的flag,藏在了PNG图片末尾追加的一段Base64编码数据里,解码之后是一段经过异或加密的字符串,再用出题人埋在图片EXIF里的密钥做异或还原,才拿到最终flag。

下面我把每一步的思考过程、工具选择、以及常见的翻车点都展开讲。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进