Base64隐写解题记:从一张报错图片到CTF flag
1. 一张报错的图片把我拽进了Base64隐写的坑事情是这样的。某次CTF比赛线上赛阶段杂项题里给了一个看起来平平无奇的图片链接。点开之后浏览器直接白屏控制台报了一个格式错误——仔细一看URL里的图片数据不是常规的data:image/png;base64,开头而是data:image/pngbase64,注意这里的分号是中文全角分号而且 base64 和逗号之间多了一个空格。我当时的第一反应是出题人手滑了但CTF题里从来没有真正的手滑每一个看似错误的细节都可能是解题的钥匙。果然把这段数据完整复制下来去掉data:image/pngbase64,这个前缀之后剩下一大串Base64字符串。我用Python的base64.b64decode()去解码得到了一串文件头是89504E47的PNG文件内容。写到本地再打开图片能显示但画面上只有一行小字flag不在这里再看看别处吧。这就是典型的Base64隐写题开局。这道题来自河南省第二届金盾信安杯的CTF杂项方向题面本身不复杂但考察的知识点非常集中Base64编码原理、PNG文件结构、隐写分析的基本思路。这篇文章我就把完整的解题过程、踩过的坑、以及这类题目的通用解法都梳理一遍给准备打CTF杂项的朋友做个参考。先说结论这道题的核心考点有两个一是识别出被伪装过的data:image/pngbase64,前缀二是对Base64字符串进行二次处理——包括可能的隐写位提取、图片尾部附加数据、或LSB隐写。我实际解出来的flag藏在了PNG图片末尾追加的一段Base64编码数据里解码之后是一段经过异或加密的字符串再用出题人埋在图片EXIF里的密钥做异或还原才拿到最终flag。下面我把每一步的思考过程、工具选择、以及常见的翻车点都展开讲。