资讯详情

CTF Misc 隐写术实战:从图片到音频的藏匿与排查全指南

📅 2026/10/2 10:23:35 | 华诺云谱 👁 阅读
CTF Misc 隐写术实战:从图片到音频的藏匿与排查全指南
上周训练赛里有一道Misc题把不少新队员卡了快一个小时一张看起来完全正常的图片格式没错、尺寸也没错双击能打开但Flag就藏在里面。有人用记事本打开看到满屏乱码就开始抓瞎有人对着图片里的每一个图案反复解读也有人干脆怀疑题目出错了。其实那道题只做了一件事把zip压缩包直接拼接到了PNG文件的尾部strings扫一下就能看到PK头连高级工具都用不上。CTF的Misc模块说白了就是一场针对文件格式、编码习惯和信息藏匿手段的侦探游戏。今天这篇继续“CTF Misc模块系列分享”的第三篇专门讲图片隐写和音频隐写这两个高频考点从最基础的字符串搜索、文件分离到LSB像素修改、频谱图分析每个步骤背后的原理我都会讲清楚再配上一套可以直接抄作业的排查流程。文章默认你是刚接触CTF的初学者但也欢迎有经验的朋友一起查漏补缺看看自己有没有漏掉什么好用的习惯。1. Misc 隐写术的底层逻辑这不是玄学是信息藏匿很多人第一次接触Misc看到“杂项”两个字就容易轻视。但打过几场比赛你就会发现Misc反而是最能拉开差距的模块之一它不要求你懂汇编、不要求你会注入但它非常考验观察力、文件格式功底和信息敏感度。而隐写术Steganography又是Misc里反馈感最强的一块只要找对藏东西的位置Flag几乎就白送了。1.1 为什么 CTF 的 Misc 适合作为入门第一站CTF 里的题目类型很多Web 考察代码审计和漏洞利用Pwn 考察二进制利用和系统底层Reverse 考察逆向分析和算法还原Crypto 考察数学和密码协议。这些方向都需要大量的前置知识新手上手容易碰壁。Misc 的起点则要低得多它基本建立在“你平时会不会用电脑”这个基础上。只要你会看文件属性、会解压压缩包、会用搜索引擎再补一点十六进制和编码概念就能开始玩出成绩。Misc 的玩法本质上像是寻宝。出题人把 Flag 藏在一个看似无害的文件里可能是图片、音频、压缩包、流量包甚至是内存镜像。解题人要做的是通过文件格式解析、隐写工具分析、编码转换等手段把这个信息找回来。整个过程没有太多“攻击性”更像是在做一次严谨的数字取证。对新手来说这种正反馈非常关键你不需要太多前置知识就能在半小时内体会到“挖出隐藏内容”的成就感。这种成就感会反过来逼着你学更多东西。比如你为了懂 LSB 隐写就会去了解 RGB 颜色通道为了分离文件尾部拼接的内容就会去查各类文件的文件头十六进制特征为了分析音频频谱图就得知道 Audacity 怎么用。知识是链条式的而 Misc 正好是那个最自然的起点。1.2 出题人常见的四种藏 Flag 姿势隐写术的历史其实很古老早在数字时代之前人们就会用隐形墨水、发丝位置、字母间距来传递秘密信息。到了计算机时代藏匿信息的载体变成了文件本身但核心思想没变让秘密看起来像无害的日常内容。在 CTF 的图片和音频题目里出题人常用的藏法大致可以分成四类隐藏方式具体表现第一眼检查手段文件尾部拼接在正常图片后面追加压缩包或其他文件strings、binwalk、查看文件尾部十六进制元数据隐藏把 Flag 写在 Exif 注释、图片属性、Title 字段里右键属性、exiftool像素级隐写修改图片 RGB 值的最低位人眼无感zsteg、Stegsolve、Python 脚本音频隐藏藏在频谱图、倒放音频、波形节奏、摩斯码中Audacity、音频频谱分析我见过很多选手拿到文件后的第一反应是“这图咋看”然后开始盯着屏幕上的图案脑补。这是最大的误区。绝大多数隐写题的 Flag 不在“画面内容”里而在“文件结构”和“像素通道”里。你真正需要做的是像一个取证人员一样把文件从外到内、从表面到底层过一遍。下面这两章就分别对图片和音频展开讲。2. 图片隐写从文件尾巴到像素深处的递进排查图片是隐写题里出现频率最高的载体没有之一。原因很简单图片文件结构复杂有头部、有元数据区、有像素数据区还有很多肉眼看不见的角落可以藏东西而且图片格式众多PNG、JPG、GIF、BMP各有各的解析方式给足了出题人发挥空间。解题的顺序也很重要千万别一上来就上 zsteg 乱扫先做不费脑的排查再去啃硬骨头。2.1 先做“不费脑”的排查元数据与可见信息拿到一张图片第一件事不是打开它看内容而是先看文件的“身份证”。右键文件属性看常规信息里有没有备注用看图软件打开后看有没有标题、说明、经纬度之类的信息。很多新手会漏掉这一步因为题目看起来“没问题”但实际上出题人只需要在图片的元数据字段里写一行注释Flag 就出来了。在 Linux 终端里查看元数据最方便的工具是 exiftool。它能把 JPEG、PNG、TIFF 等格式里所有可读元数据一口气列出来exiftool flag.png输出里重点看这些字段Title、Comment、Author、Copyright、ImageDescription、GPS 信息以及各种你看着眼生的自定义字段。举个例子PNG 格式允许在文件内部写入文本块有些碰巧出题的题目会把 Flag 放在一个叫tEXt的 chunk 里你在图片上右键属性查看“详细信息”往往就能看到或者在 exiftool 输出里直接看到Flag: flag{wait_you_can_see_me}。也别忘了直接搜索可打印字符串。这是最古老也最有效的手段之一strings flag.png | grep -iE flag|ctf|key|pass|zipstrings会把文件中所有连续的可打印字符提取出来如果 Flag 是明文藏在文件尾部或者藏在某些文本字段里基本一搜一个准。注意这里搜出来的结果可能包含大量干扰项比如图片渲染引擎里的版本字符串不要看到flag字样就激动要结合上下文判断。2.2 扫描文件结构把藏在里面的压缩包挖出来如果元数据和字符串搜索没结果下一步就要看图片的文件结构了。隐写题里有个非常经典的出法出题人做好一张图片后直接cat flag.zip flag.png把压缩包拼接在图片后面。图片软件只会读它自己需要的部分完全不会在意文件尾部多了什么但 zip 文件有自己独立的文件头在十六进制编辑器里很容易被认出来。先用 binwalk 对图片做一次整体扫描。binwalk 的作用是分析文件里是否存在其他已知格式的签名binwalk flag.png如果输出里在某个偏移位置出现了 ZIP 头50 4B 03 04那基本就能确定图片尾部藏了压缩包。接下来用两种方式把它分离出来用dd按偏移量手动切割。假如 binwalk 报告 ZIP 起始偏移是89597dd ifflag.png ofhidden.zip bs1 skip89597直接用foremost自动提取foremost -i flag.png -o extracted这里有个容易被忽略的坑bs1的时候 dd 的速度会很慢但为了保证偏移准确也只能这样。实际比赛里我通常先试foremost因为它的容错性更好能把可能存在的多个内嵌文件都提取出来。提取出 zip 之后先看压缩包内容名录再解压。如果压缩包被加密但密码很明显比如文件名、题目作者名或者题目名称就手动试一下不要急着上爆破工具。看文件头是门基本功。常见的文件格式签名最好记几个文件类型十六进制文件头ASCII 标识PNG89 50 4E 47.PNGJPEGFF D8 FF无常以乱码出现ZIP50 4B 03 04PK..GIF47 49 46 38GIF8RAR52 61 72 21Rar!这些签名是解题时的“坐标”。看到 PK 头就知道是压缩包看到89 50 4E 47就确认是 PNG碰到文件头被改坏的题目也是靠这些签名去修复的。2.3 深入像素LSB 隐写的原理、提取与工具化文件层没问题之后就该上第二层了像素数据。这里最常见的题型叫 LSB 隐写。先讲原理这个真的很重要。一张真彩色图片的每个像素通常用三个字节表示分别存储 R红、G绿、B蓝三个颜色通道的值每个值的范围是 0 到 255换算成二进制就是 8 个比特位。比如一个像素的 RGB 值是(200, 150, 100)它们在内存里长这样R 的 200 11001000G 的 150 10010110B 的 100 01100100所谓 LSB就是 Least Significant Bit最低有效位也就是每个字节最右边的那一位。把11001000的最低位从 0 改成 1得到11001001也就是 201。一个像素的亮度从 200 变成 201肉眼几乎察觉不到。于是出题人可以把要隐藏信息的每一个比特按顺序写进所有像素颜色通道的最低位里。多少像素能藏一个字节的信息答案是 8 个像素的红绿蓝三通道各取一位正好凑成 8 位。比如你想隐藏字母bASCII码0x62二进制01100010就按顺序找 8 个像素把它们的 R 通道最低位依次改成 0、1、1、0、0、0、1、0 就行。提取的时候反过来读取每个像素 RGB 三通道的最低位每 8 位拼一个字节就能还原出完整信息。这个过程完全可以用 Python 手动实现。PIL 库读取像素后做位运算即可from PIL import Image img Image.open(flag.png) pixels list(img.getdata()) bits [] for r, g, b in pixels: bits.append(r 1) bits.append(g 1) bits.append(b 1) data bytearray() for i in range(0, len(bits) - 7, 8): v 0 for bit in bits[i:i8]: v (v 1) | bit data.append(v) # 在还原出来的字节流中搜索常见文件头 idx data.find(bPK) print(data[idx:idx50])运行后如果输出了PK开头的字节流说明 LSB 里藏的是一个 zip 包把这段字节流保存成 zip 再解压往往就能拿到 Flag。不过大部分情况下不用手写脚本工具能省很多事。PNG 和 BMP 的 LSB 隐写检测我首选 zstegzsteg -a flag.png它会把所有通道组合、所有位层都扫一遍然后直接输出检测到的隐藏文本。zsteg 的扫描结果里如果有一行imagedata .. text: flag{...}那基本就结束了。如果题目里的隐藏数据量比较大zsteg 只会告诉你发现了什么不一定能完整还原文件这时候再用 Python 脚本做完整提取。还可以用 Stegsolve 配合肉眼看各个通道的位平面。传统做法是把图片分别切到 R、G、B 通道的第 0 位平面如果某个平面呈现出明显的图案或文字说明这里藏了东西。Stegsolve 的界面虽然老旧但在快速判断“哪个通道有问题”时非常好用。3. 音频隐写Flag 就藏在波形与频谱里音频隐写在比赛里通常比图片隐写更让新手头疼因为“听”这个行为本身就有很大的不确定性。很多时候 Flag 不是靠听出来的而是靠“看”声音的波形或频谱才发现的。音频的载体多为 WAV、MP3少数会出 APE、FLAC 等无损格式不同格式对应不同的隐写方式。3.1 音频隐写的常见形态音频文件的隐藏方式可以从两个维度理解一个是隐藏位置另一个是隐藏形式。从位置来看常见的藏法包括藏在频率域里也就是频谱图的某些区域。藏在时间轴上比如把音频倒放、把语速改成极快或极慢。藏在波形包络里利用短音、长音的节奏形成摩斯电码。藏在声道或相位信息里左右声道互换、某一声道被删除。利用专门的音频隐写工具比如 MP3Stego 可以把明文嵌进 MP3 的压缩编码过程中。如果题目给的是 WAV那基本就是频谱图、倒放、摩斯电码这几个方向。如果给的是 MP3那先注意听音频内容是否正常再考虑 MP3Stego 这类工具。3.2 用 Audacity 把声音“变成图片”看Audacity 是解决音频隐写题最常用的免费工具。很多人只知道它能录音、剪切却忽略了它的频谱视图功能。所谓频谱图就是把音频从时间域转换到频率域横轴是时间纵轴是频率颜色深浅表示能量强弱。一张正常的语音频谱图看起来像一团模糊的噪声分布但如果有人在特定频段里人为写入了文字或图案你在频谱视图里就能直接“看到”它。具体操作很简单打开 Audacity导入音频文件。点击音轨左侧的下拉菜单把显示模式从“波形”切换到“频谱图”。如果频谱图默认太小也可以把音轨高度拉大再用缩放工具放大查看。很多题目的 Flag 就是直接以文字形式画在频谱图里的。我曾经遇到一道题频谱图里赫然写着flag{sound_spectogram_show}完全不需要任何提取操作。还有的题会在一段正常的 BGM 的频谱里藏一张二维码截图这时候你先截频谱图再拿二维码扫描器去解就能得到后续信息。音频倒放也是个高频考点。如果一段音频听起来很奇怪像是有某种“反着说话”的感觉全选音频然后菜单栏执行“效果 - 反向Reverse”再播放一遍。反向后经常会听到清晰的语音提示或者直接在频谱视图里看到被倒置的文字。别小看这个操作它虽然简单但救过我很多次。变速分析同样很重要。有些出题人会故意把语音疯狂加速让人听不出内容。这时候用“效果 - 改变速度Change Speed”把速度降下来或者用“效果 - 改变音调Change Pitch”在不改变语速的情况下调整音高往往就能听清。如果你怀疑内容被放慢了那就反向操作提速到一个听起来正常的范围。3.3 波形里的摩斯电码与双音多频信号另一种在音频题目里经常出现的隐藏方式是摩斯电码。摩斯电码本身不是隐写但它经常被当作隐蔽信息的编码层使用把 Flag 先转成摩斯序列再把摩斯序列变成不同长度的音调写入音频。在波形视图里摩斯电码长这样每个字符由短音和长音组成短音通常 0.1 到 0.2 秒长音通常 0.3 到 0.5 秒字符之间有明显停顿。你只需要在 Audacity 里放大波形数一数每个音的长度就能把一长串“点”和“划”确认出来。实际操作时可以这样做切回波形视图缩放到能清晰看到单个音的程度。记录一段序列比如.- -... .. -.。对照摩斯电码表翻译成文本。例如.-对应 A-...对应 B..-.对应 F... 如果你看到序列是..-. .-.. .- --.就不用怀疑了继续解下去吧。还有些题会用 DTMF 双音多频信号也就是电话按键音。每个数字键按下去会同时发出两个频率的音拿到频谱图后可以看到两条平行频率线对照 DTMF 频率表就能还原数字然后再转成 ASCII 或作为后续线索。这类题目稍微冷门一点但了解原理后并不难。4. 隐写排查工具箱与标准操作流程比赛里最忌讳的状态是“拿到文件不知道下一步干嘛”。为了避免这种混乱我强烈建议你维护一套自己的工具链和排查流程。工具不需要多关键是要知道什么场景用什么东西。4.1 常用工具速查表下面这张表是我个人最常用的隐写排查组合覆盖了图片和音频两大方向工具主要用途典型命令示例file查看文件真实格式发现头部被篡改的情况file flag.pngstrings提取可打印字符串快速扫描明文 Flagstrings flag.pngbinwalk扫描文件内部是否存在其他格式的签名binwalk flag.pngforemost自动提取内嵌文件容错比 binwalk 分离更好foremost -i flag.png -o outexiftool查看完整元数据信息exiftool flag.pngzsteg检测 PNG / BMP 的 LSB 隐写zsteg -a flag.pngsteghideJPEG / BMP 的隐写提取与嵌入steghide extract -sf flag.jpgoutguessJPEG 隐写提取专门处理老牌 outguess 隐藏outguess -r flag.jpg out.txtAudacity音频波形与频谱分析、倒放变速处理图形界面操作这里需要提醒一句steghide 和 outguess 这类工具通常还需要密码。如果题目里没有明显提示先试空密码、文件名、题目名、作者名如果试不出来大概率密码藏在其他线索里不要盲目爆破。4.2 从拿到文件到出 Flag一套通用排查流程我把自己的解题过程沉淀成了一个固定流程每次遇到 Misc 隐写题都会按这个顺序走一遍基本不会漏掉关键信息先用file看文件类型确认它是不是“表面上的那个格式”顺便看文件大小是否符合认知。比如一个 PNG 图片却异常的大很可能尾部塞了东西。肉眼打开文件看内容同时查看属性、元数据、备注信息做低成本的快速排查。跑strings搜索 flag、ctf、key 等关键字符串再用 binwalk 扫描文件结构发现可疑内嵌文件就分离出来。如果是图片用 zsteg 扫 LSB用 Stegsolve 查看各通道位平面的视觉隐藏如果是音频切到频谱图查看隐藏图案执行倒放和变速试听。把发现的隐藏内容保存下来继续分析。记住提取出的数据不一定直接是 Flag有可能是另一个压缩包、一张二维码、一段编码后的字符串需要层层递进。每次操作都记录命令、偏移量、输出结果。这样即使中间思路断了也能回退到上一次的检查点而不是重新开始。这套流程看起来很基础但能覆盖掉六成以上的图片/音频隐写题。真正高级的隐写题往往是在基础流程的某一环上加了花活。5. 踩坑实录与效率心得最后这部分纯粹是我自己的实战教训。隐写题做多了你会发现很多题目并不是藏得深而是选手在错误的路径上花了太长时间。5.1 常见的无效操作与翻车现场第一个坑是“用记事本打开图片”。图片文件本质上大部分是二进制数据记事本打开看到乱码完全正常你无法从乱码中靠肉眼判断任何信息。正确的做法是使用 strings 提取可打印字符串或者用十六进制编辑器查看文件头尾结构。第二个坑是“文件头被改了还浑然不觉”。有些题目会故意把 PNG 的头部字节改成 JPG 的导致图片打不开或者工具识别错误。这时候你用file一看系统可能也报错但只要你用十六进制编辑器看一眼文件的开头几个字节再对照文件格式签名表把破坏的头部修复回来图片就能恢复正常。第三个坑是“图片被压缩导致 LSB 信息丢失”。如果题目里的 PNG 被额外转成了 JPG或经过了有损压缩那么 LSB 里存的信息基本就毁了。遇到这种情况先别panic回到题面找线索看是不是给错了附件或者是不是需要用另一种格式的原始文件。我自己就发生过一次在 JPG 上反复跑 zsteg 无果最后发现题目附件其实是 PNG只是后缀名被改成了 jpg。第四个坑是“拿到压缩包结果伪加密”。zip 伪加密是 Misc 的高频考点压缩包能正常打开目录但解压时会提示密码错误。这种问题用 010 Editor 修改压缩包的加密标志位或者直接用一些自动修复脚本绕过去。判断伪加密的方法也很简单看压缩包的通用位标志字段general purpose bit flag。如果只是标志位第 0 位被置为 1而文件数据区实际上没有加密那就是伪加密。第五个坑是“只盯着图片内容看”。有非常多的新手对着画面里的图案脑补含义比如“这个手势是不是代表数字”“这棵树是不是某个字母的形状”结果浪费了大量时间。除非题目明确提示了视觉线索否则优先检查文件层和像素层。5.2 怎么把隐写题刷出系统性收益最后说点刷题效率的体会。隐写题的工具更新不算快核心手法其实就几个大类所以你完全可以按类型整理自己的笔记。我的习惯是每做一道新题就在本地 Markdown 文件里记下题目特征、使用工具、关键命令和最终Flag的解出路径。不是记答案而是记“第一步动作”为什么这道题要从 binwalk 开始而不是从 exiftool 开始为什么这个音频要先倒放而不是先看频谱这种复盘方式能帮你把零散的题目串成一条线。刷到一定量之后你会开始“有感觉”看到一个 300KB 的 PNG第一反应是先看尾部有没有追加数据听到一段诡异的倒放语音第一反应是切频谱图按住 Shift 把频率范围拉大看到 MP3 文件异常小会先怀疑是不是只有短短几秒的人声提示。国内常见的 CTF 练习平台里都有专门的 Misc 专项比如 BUUCTF、CTFshow、攻防世界这类公开平台题量足、难度梯度完整。我的建议是每天刷一到两道不用贪多但每道题都要真正跑完流程并理解原理而不是对着别人的 writeup 抄一遍。说句实在话我打 CTF 这些年Misc 隐写题从来没有让我觉得无聊。它不像 Pwn 那样需要和系统硬碰硬更没有 Web 题那种复杂的链路推理它更像一场安静的寻宝游戏所有线索都摆在你眼前只是看你有没耐心去发现。遇到那种看上去“什么都没藏”的文件别急着怀疑题目先按流程把文件头看到文件尾把像素看到频谱把正常语速听到倒放大多数题都会露出蛛丝马迹。我个人最后想分享的一个小习惯是准备一个专门放 Misc 命令的笔记文件每做一题就往里追加一条两个月之后再回头翻你会发现自己已经总结出了一套比网上绝大多数教程都顺手的解题心法。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑