从一张二维码到CTF flag手把手复盘BUUCTF SWPU2019那道‘神奇’的隐写题第一次看到这道题时我盯着那个看似普通的二维码足足发呆了五分钟。作为CTF新手我天真地以为扫描二维码就能直接得到flag——事实证明这种想法实在太年轻了。这道题教会我的不仅是技术更是一种抽丝剥茧的思维方式。1. 初探二维码的第一次欺骗当我用手机扫描这个二维码时得到的只是一串毫无意义的字符U2FsdGVkX1。这明显不是flag的格式而更像是某种加密的头部特征。这时候我意识到这可能是个典型的套娃题——表面是二维码实际需要层层解码。提示在CTF中遇到看似简单的结果时第一反应应该是这很可能只是第一层。我尝试用最常见的Base64解码这串字符但结果依然是乱码。这时候我做了三件事检查字符集特征发现包含大小写字母、数字和符号尝试常见编码转换Hex、URL编码等搜索U2FsdGVkX1这个特征串最终发现这其实是OpenSSL加密数据的特征头。这个发现让我既兴奋又沮丧——兴奋是因为找到了方向沮丧是因为需要密码才能解密。2. 深入隐藏在像素中的秘密既然直接扫描不行我决定用Stegsolve分析二维码图片。在调整色板时发现了一个有趣的现象通道异常现象Red最低有效位有规律噪点Green存在异常条纹Blue部分区块亮度不一致使用以下Python代码提取LSB隐写信息from PIL import Image img Image.open(qr.png) pixels img.load() binary_str for y in range(img.size[1]): for x in range(img.size[0]): r, g, b pixels[x, y] binary_str str(r 1) # 将二进制转换为ASCII message .join(chr(int(binary_str[i:i8], 2)) for i in range(0, len(binary_str), 8)) print(message[:100]) # 打印前100个字符观察这段代码提取出了一段看似随机的字符但仔细观察会发现其中有重复出现的..-.这样的模式——这是摩斯电码的典型特征3. 转折大小写敏感的摩斯陷阱将提取的字符转换为摩斯电码后我遇到了这道题最大的坑大小写敏感问题。最初我直接使用在线解码工具但得到的全是乱码。直到我注意到.和-的大小写混合出现某些-实际上是下划线_空格有时是单个有时是双个经过多次尝试最终正确的处理流程应该是统一将字符转换为小写用正则表达式过滤无效符号re.sub([^.- ], , text)将连续两个空格替换为单词分隔符 / morse_code ... --- ... / .--. ..- -..- .. morse_dict {.-:A, -...:B, -.-.:C, ..-.:F, ....:H, .:E, .-..:L, --:M, ---:O, .--.:P, --.-:Q, ...:S, -:T, ..:I, .--:W, -..-:X, -.--:Y, --..:Z, /: } decoded .join([morse_dict[i] for i in morse_code.split()]) print(decoded) # 输出SOS PUXI这个SOS PUXI看起来像是密码提示但实际比赛中这是个干扰项真正的关键在摩斯电码转换过程中被忽略的符号。4. 突破当二维码遇见压缩包回到最初的U2FsdGVkX1字符串结合摩斯电码中隐藏的puxi作为密码尝试果然解密出了一段新的数据openssl enc -d -aes-256-cbc -md md5 -in encrypted -out decrypted -k puxi解密后的文件是个zip压缩包但需要密码。这时候我想起之前提取的二进制数据中有一段异常长的0xFF序列将其转换为hex后发现是PK头——原来图片里还藏着一个压缩包使用binwalk分离出隐藏的压缩包binwalk -e qr.png但密码呢经过前面的折腾我几乎要放弃时突然想到最初的二维码扫描结果中有一个不起眼的swpu2019字样——这正是压缩包密码解压后得到一个txt文件里面的flag却显示fake_flag。这时候我才明白整个解题过程就像洋葱一样层层包裹而真正的flag藏在最意想不到的地方——二维码图片的EXIF信息中exiftool qr.png | grep -i comment最终得到的flag格式为flag{Th1s_1s_Re4l_F1a9!!!}5. 经验总结与避坑指南这道题教会我几个重要的CTF解题原则多重验证每个步骤的结果都要用不同工具或方法交叉验证关注异常对任何不符合预期的输出保持敏感完整遍历尝试所有可能的解释而不仅是最明显的那个最让我印象深刻的是这道题至少有五个关键转折点每个都可能让人放弃。现在回头看那些看似毫无意义的乱码和干扰项其实都是出题人精心设计的路标。真正的挑战不在于技术难度而在于保持耐心和系统性的思考方式。