ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CTF隐写术实战复盘:LSB、伪加密与音频频谱的五层套娃解法

CTF隐写术实战复盘:LSB、伪加密与音频频谱的五层套娃解法 1. 隐写术到底在玩什么从一个Misc题选手的视角说起先说个现象。很多人觉得CTF里Misc杂项就是送分题结果一上手就被各种文件格式、编码、隐写手法按在地上摩擦。我自己打CTF这几年Misc题反而是最容易卡住新手、也最考验耐心的一类。尤其是隐写术综合题往往一道题里塞了三四层套路先是图片里藏了压缩包压缩包是伪加密解开之后里面有个音频音频频谱里画着另一串字符最后字符解出来才是flag。这种题做不出来不是因为你不会某个工具而是因为你不知道原来还能这么玩。这篇Writeup不是流水账而是把我实战中踩过的坑、总结出的套路、以及一套可以复用的排查流程全部拆开讲。不管你是刚入门CTF、连binwalk和strings都分不清的新手还是已经能独立解常规Misc题、想系统性梳理隐写术思路的进阶选手这篇都值得你花二十分钟慢慢看。我会从工具选型讲到具体操作再到常见误区和排错方法全部是基于真实题目的复盘。先说清楚隐写术这个核心概念。它和密码学不一样密码学是把明文变成看不懂的密文目的是让你看不懂隐写术是把你本来要隐藏的信息伪装成看起来很正常的东西目的是让你根本不知道这里有信息。最常见的载体就是图片、音频、视频、压缩包、文本文件甚至网络流量包。CTF里的Misc隐写题考的就是你能不能在一个表面正常的文件里发现并还原出被藏起来的数据。我记得第一次做隐写题的时候拿着一个PNG图片题目提示flag在图片里我愣是把图片放大了十倍盯着像素看看了半天也没看出名堂。后来才知道用StegSolve切一下RGB通道、看一下LSB层三分钟就能出来。这就是典型的不知道套路导致效率极低。所以这篇复盘的核心思路就是把隐写题当成一次法证分析。你要做的不是猜而是按照一套标准流程逐层检查文件结构、字符串、元数据、像素数据、音频波形、压缩包属性直到把flag挖出来。下面我按实战流程一步步展开每个环节都会配上我当时是怎么想的和为什么要这么做。2. 做隐写题前必须建好的工具链与排查思路2.1 先把这些工具装齐别到用的时候干瞪眼工欲善其事必先利其器。我做Misc隐写题时本机常备一套工具全部开源免费跨平台能跑按使用频率从高到低排列如下。第一梯队文件分析与Stringsfile、binwalk、strings、foremost、hexedit或010 Editor。file用来识别文件真实类型因为CTF里经常出现改后缀名藏文件的骚操作binwalk扫嵌入文件极其好用能直接拆出藏在图片/固件里的压缩包strings提取可见字符串遇到纯文本flag或者特殊标记非常有效foremost做文件雕刻专门对付删除文件或文件碎片。第二梯队图片隐写专用StegSolveJava写的老工具现在依然能打、zsteg专门检测PNG/BMP的LSB隐写、stegpy、outguess、F5工具。其中zsteg是我个人最推荐的它对LSB类的检测非常全面一次能扫出多种位平面组合方式省去手动切通道的功夫。第三梯队音频与杂项Audacity看频谱和波形、Sonic Visualiser、DeepSound音频文件藏文件的工具、mp3stego。音频题的核心就是频谱图和声道分析Audacity免费、开源、功能够用。第四梯队压缩包处理7-Zip、Ziperello或ARCHPR爆破密码、zipinfo查看压缩包详细信息判断是否伪加密。伪加密是Misc题库里出现频率极高的考点后面我会单独开一节讲。第五梯队取证与编码CyberChef网站万能转换器必须收藏、John the Ripper密码爆破、fcrackzip、python3PIL、numpy、binascii这些库都用得上。CyberChef简直是Misc神器字符串进制转换、URL解码、Base64、凯撒移位、RSA工具链几乎都内置了界面拖拽式操作我用它处理过无数奇怪的编码。装这些工具的时候有两个小建议。一是尽量用包管理器安装Linux下apt、macOS下brew别从乱七八糟的站点下exe避免被植入后门二是StegSolve的Java环境注意版本太新的JDK可能跑不起来我一般用JDK11配合旧版Java8的兼容配置。2.2 一套通用排查流程九成隐写题都能走通工具备齐之后关键是流程。我总结了一套五步法每道隐写题先跑一遍能过滤掉百分之八十的干扰项剩下的再针对特定类型深挖。第一步文件类型识别。先file 文件名如果扩展名和真实类型对不上比如名为.jpg其实是.zip直接改后缀名再处理。这里有个细节有些题目故意把后缀改成.png但内容实际是.rar你用图片工具怎么弄都出不来浪费大量时间。改后缀之前建议用十六进制查看器确认文件头。常见文件头JPEG是FF D8 FFPNG是89 50 4E 47ZIP是50 4B 03 04RAR是52 61 72 21GIF是47 49 46 38PDF是25 50 44 46。第二步字符串扫描。strings 文件名 | grep -i flag或者不过滤直接看全部输出优先找flag、CTF、key、secret、password这些关键词。有时候字符串里直接就是base64编码的flag解码即得。这一步成本最低也最容易捡到分。第三步binwalk扫描与文件分离。binwalk 文件名看文件尾部或缝隙有没有嵌入其他文件。有的话binwalk -e 文件名自动提取或者用foremost做更激进的雕刻。这一步能发现图片里藏的压缩包、视频里藏的图片等文件套文件的情况。第四步图片像素级检查。如果前三步没收获上zstegzsteg -a 文件名。它会尝试所有常见的LSB位平面组合输出隐藏信息。如果zsteg扫不到再用StegSolve手动遍历RGBA各通道的低位。还有一种情况是图片整体看起来有条纹或者噪点可能用了LSB隐写且加密过这时候要么试stegpy要么手工提取像素后按位还原。第五步元数据与附加数据检查。用exiftool 文件名查看EXIF信息看注释、版权、GPS坐标里有没有藏东西。有时候flag就写在图片描述里。再检查文件尾部是否有追加数据tail -c 100 文件名看看最后面有没有奇怪的字符串。这五步走完没有flag的题很少。真走完还没有就得考虑是不是音频题、压缩包题、流量包题了那再跳到后面的专项方法。这一步要强调不要跳步。我见过不少人上来就开StegSolve结果漏了binwalk里的压缩包白折腾半小时。3. 图片隐写从空间域到频域一次讲透3.1 LSB隐写原理与实操答案就藏在像素最低位图片隐写是Misc题的大户LSB又是图片隐写里的绝对C位。原理很容易懂一张24位真彩色图片每个像素的红、绿、蓝三个通道各占8位比如某个像素的红色分量是0xE3二进制11100011它的最低有效位Least Significant Bit是1。把一张图片所有的像素最低位抽出来拼在一起就是一段二进制数据。如果把这1个bit改成0视觉上颜色的变化微乎其微人眼根本察觉不到但信息就这样藏进去了。这就相当于在一张满是黑点的白纸上把其中一部分黑点位置稍微挪动一丁点你不拿放大镜根本看不出区别但按特定规则读取那些细微变化的位置就能还原出另一幅图案或文字。实操上最简单的是用zsteg。比如题目给了一个flag.png终端里敲zsteg -a flag.png输出里如果有b1,rgb,lsb,xy这种行下面跟着一串可读字符那大概率就是flag。zsteg -a会穷举所有常见组合包括不同通道顺序RGB、RBG、BRG等、不同位平面第0位、第1位、第2位等、不同扫描方向行扫描、列扫描、对角线扫描所以比StegSolve手切效率高得多。但zsteg不是万能的。有些题目未使用常规LSB顺序比如把信息按列优先写入或者把RGB最低两位都用上即2-bit LSBzsteg也能处理因为它的字典表很全。遇到zsteg没出来的我再上StegSolve手动看打开图片后Analyse-Data Extract勾选Bit Order的LSBBit Plane全选R、G、B的0位然后Preview或Save保存出来是个bin文件再file一下看是什么。如果是PNG直接改后缀打开如果是个加密包再走压缩包流程。LSB题常见的一个坑是提取出来的数据看不出明文。这是因为隐藏数据经过了加密或压缩。常见处理是提取出来的bin文件开头如果是PK即50 4B说明是ZIP直接改后缀解压如果是89 50 4E 47说明提取出来本身就是个PNG图片二次隐藏如果是乱码但字符集是base64范围那就先base64解码再分析。3.2 图片属性与文件结构里的隐藏信息除了像素级操作图片本身的文件结构也经常被用作藏匿点。最典型的就是在图片末尾直接追加数据。PNG文件格式规定了数据块结尾是IEND49 45 4E 44很多题目把压缩包或者flag文本直接追加在IEND后面。你用图片查看器打开完全正常因为程序读到IEND就停止渲染了之后的内容不会影响显示。但strings一下就能看到尾巴上的PK头或者flag{字样。另一种是EXIF。拍过照的人都知道数码照片会记录拍摄时间、相机型号、GPS坐标等信息这些信息存储在EXIF块里。题目可以往EXIF的ImageDescription、Artist、Comment字段写文字flag用exiftool直接读exiftool flag.png | grep -i comment还能往EXIF里塞整个压缩包因为EXIF块允许二进制数据。这种就不算纯隐写了更像是文件拼接。还有一种容易被忽略的图片尺寸异常。有些题目把图片的真实宽度和高度信息故意改小导致图片显示不完整但实际上剩余部分藏着信息。最经典的是PNG它的IHDR块里用4字节存了宽度、4字节存了高度。如果图片被裁过或者改过宽高显示出来的图只有一部分里面藏的另一半就隐藏了。这个在Misc题叫PNG高度修复。我遇到过一个题图片是张二维码但只显示上半部分明显下半部分被藏起来了。解决办法是用十六进制编辑器打开PNG找到IHDR块通常在文件头后第16个字节开始把高度值改成和宽度一致或更大然后图片就能全部显示了。宽度高度位置有规律PNG文件头89 50 4E 47后面跟着0D 0A 1A 0A然后是IHDR长度00 00 00 0D再是49 48 44 52IHDR标记接着4字节宽度、4字节高度。如果不知道内嵌的正常高度可以暴力尝试几个常见值或者用pngcheck工具检查CRC错误因为改了高度后CRC会不匹配。3.3 二维码与图片叠加类隐写二维码在Misc题里出现频率也很高。隐藏方式多种多样直接给一张扫描不出来的二维码可能是缺少定位角、污染了大块像素、或者用了半色调处理让二维码藏在灰度图里。最邪门的一种是二维码叠加两张三十二乘三十二的小二维码上下排列看起来就是普通的黑白马赛克但你逐个像素比较两图的异或结果会发现第三个隐藏二维码。Python脚本十行就能解决from PIL import Image img1 Image.open(qr1.png).convert(1) img2 Image.open(qr2.png).convert(1) w, h img1.size img3 Image.new(1, (w, h)) pixels1 img1.load() pixels2 img2.load() pixels3 img3.load() for y in range(h): for x in range(w): pixels3[x, y] pixels1[x, y] ^ pixels2[x, y] img3.save(out.png)这个思路可以推广到两张看似无关的图片逐像素异或出信息。之所以用异或是因为如果两张图是同一张原图分别叠加了不同的隐藏信息异或后共同的部分会抵消只留下隐藏信息。还有一类是把二维码藏进图片的Alpha通道。Alpha是透明度通道肉眼看不到但用zsteg或PIL能提出来。遇到怀疑有二维码但怎么都扫不出的情况可以试着把图片转成灰度图再调对比度或者提取单一颜色通道看看往往能找到轮廓。4. 压缩包专项伪加密、CRC碰撞与暴力破解4.1 伪加密一个字节的天壤之别如何一眼识破压缩包题型是Misc的另一座大山其中最坑的就是伪加密。先解释一下ZIP文件格式里每个文件条目在Local File Header和Central Directory Header中都有一个general purpose bit flag通用位标志第0位如果是1表示文件加密。加密的ZIP在解压时需要密码如果这个标志位是1但文件内容实际没加密只是标志位被改了就叫伪加密——解压时提示要密码其实不需要你只要把标志位改回去就能直接解压出文件。这就好比一把锁锁芯根本没上锁但锁的说明书上写着已上锁。你非要找钥匙其实把说明书改一下就能开。判断是不是伪加密最简单的方法是看压缩包的十六进制。在010 Editor或在线hex工具里打开ZIP找到第二条或更多条目的General Purpose Bit Flag。ZIP全文件有多个头快速定位搜索50 4B 03 04Local File Header标志位在文件头里偏移4-5字节处即50 4B 03 04后第4个字节开始。如果值是00 00则未加密若是09 00或01 00则可能是加密或伪加密。更靠谱的判断法是丢给7-Zip或WinRAR试试。7-Zip在解压时如果猜到是伪加密会直接告诉你文件头被破坏或提示少密码但内容是可见的。经验上题目告诉你有密码但又不给提示或者一点字典都不给十有八九是伪加密。修复伪加密的方法把对应标志位的最后一个字节改为00即把09 00改成00 00把01 00改成00 00。注意有些ZIP有多个条目每一个条目的标志位都要改。改完另存再解压就是明文了。Python一行也行python3 -c import re,sys dataopen(fake.zip,rb).read() datadata.replace(b\\x09\\x00, b\\x00\\x00, 1) # 只替换第一个条目 open(fixed.zip,wb).write(data) 4.2 真加密的突破口已知明文、CRC32碰撞和字典爆破确认是真加密后有密码才能解压那突破口在哪第一种是弱密码爆破。CTF出题人一般不会用特别复杂的密码常见就是纯数字6位、admin、password、flag变体。直接用ARCHPR暴力或字典几秒钟到几分钟能跑出来。如果是纯数字4位秒出6位数字也只要几分钟。如果密码是一个英文单词用rockyou.txt大字典跑John the Ripper或者fcrackzip都行fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt encrypted.zip第二种是CRC32碰撞。ZIP里每个文件都有CRC32校验值如果文件内容很短比如只有几个字节可以通过穷举文件内容来找出对应的原始数据因为CRC32校验值不依赖密码仅仅依赖文件内容。这个技巧非常经典假设压缩包内有个flag.txt只有4字节内容你已知CRC32值那么穷举所有4字节组合算一下CRC32匹配上就还原出了明文。Python可以用binascii.crc32跑穷举。由于空间有限比如4字节就256的四次方几秒就能出。第三种是明文攻击。如果你知道压缩包里某个文件的明文内容比如题目给了个README或者图片注释里有相同文件可以用已知明文攻击来破解加密zip工具是pkcrack。不过这个在CTF里相对少见因为需要你恰好拿到同一文件属于加分项不展开细聊。我踩过的坑遇到真加密先看压缩包里有没有小文件小于等于4字节有就优先CRC碰撞而不是直接暴力跑。因为碰撞是确定性的一定出结果暴力则完全依赖密码强度可能跑一天也出不来。4.3 压缩包套娃循环解压与Zip Slip的思路有些题出得比较阴间把压缩包解出来还是一个压缩包再解还是循环好几层。这种题就是纯粹考验你写脚本的能力。每层密码可能是上一层的文件名也可能是固定密码或者伪加密。我见过一个10层嵌套的题每层里面是一个同名的小zip密码是123456解法就是写个循环while [ -f *.zip ]; do f$(ls *.zip) unzip -P 123456 $f rm $f done如果是伪加密的套娃前面那个09 00改成00 00的脚本再套一层循环即可。还有一类是Zip Slip思路在CTF中的应用压缩包内条目可以带路径穿越字符../解压时会写到目标目录之外。但Misc题一般不考这个更多是Web方向。这里提一句只是防止你在解压时遇到奇怪的路径报错不知所措。5. 音频与流量包隐写以及编码类杂项考点5.1 音频隐写三大招频谱、波形、差值音频题在Misc里属于提示给得很明显的类型。最常见的藏法是用工具把文字或图片转成音频频谱图播放起来是普通音乐或噪音但打开频谱编辑器能看到像是用画笔写上去的字符串或图案。操作就是拿Audacity打开音频文件切到频谱视图视图-频谱图拉大时间轴肉眼扫。flag经常横跨整个频谱很显眼。有一次我一打开就在低频区域看到BZHW{...}字符根本不用分析。还有不少题目把摩斯电码用不同的音调藏在音频里长音是短划、短音是点、静音是分隔。这时候用Audacity看波形把长条波形和短条波形转成点和划再解码摩斯即可。第二种是声道差值。双声道音频左声道和右声道一个藏原始音频、一个藏经过某种运算的信号你把两声道相减或异或就能还原出隐藏的信息。Audacity的音轨 - 混音 - 混合轨道并生成新音轨里可以设置差集。第三种是LSB音频隐写。音频文件同样可以在采样点的最低位藏数据。工具可以用DeepSound或者mp3stego注意mp3stego只支持WAV转MP3的特定结构。不过实战中音频LSB没有图片LSB出题频率高主要因为容量小且容易失真。我遇到就更倾向于先跑一遍strings因为音频尾部直接追加字符串的题目也很多。5.2 流量包分析pcap里的flag江湖现在很多Misc题喜欢包一层网络流量分析。给一个.pcap或.pcapng让你从HTTP、TCP、DNS、USB、蓝牙等协议里找flag。新手最怕这种因为打开Wireshark看到几万条报文完全不知道从哪看起。我的建议是先看协议统计。菜单栏统计 - 协议分级看看哪个协议占了大部分报文。如果HTTP多就重点过滤http看URL、表单参数、文件上传下载如果DNS多就过滤dns查询域名里常藏base64或字符串拼接如果USB多一般是键盘流量或鼠标流量键盘流量把每个Leftover Capture Data按USB HID键值表转成字符。有一次遇到USB键盘流量题里面藏了flag我当时写了个Python脚本把pcap里的usb.capdata提取出来每个字节转成键盘键码再用HID键值表映射。这是比较费时但常见的一个考点。更简单的HTTP题过滤http.request.method POST看POST数据里有没有提交flag过滤http contains flag可能直接看到明文。TCP流里也可能藏右键报文-追踪流-TCP流逐个看可疑流有些题把所有流拼起来才能凑出完整flag。还有一个工具叫NetworkMiner自动提取流量中的文件比手动Wireshark快遇到里面嵌图片或压缩包的题很省力。5.3 编码类Base64只是入门脑洞才是关键Misc题里编码转换算是最贴近基础的一类但也最容易让人糊。不仅仅考Base64还会考十六进制、二进制、八进制、URL编码、HTML实体、Unicode变体、栅栏密码、凯撒移位、维吉尼亚、Quoted-Printable、Brainfuck、Ook甚至还有盲文、猪圈密码这类冷门的。我的处理原则是先看字符集再猜编码。如果字符串里只有A-Za-z0-9/优先试Base64如果有大量%开头先URL解码如果全是0-9和A-F转十六进制看ASCII如果看着像摩斯只有点划和空格直接翻译。如果一个都不像那就丢给CyberChef的Magic功能它能自动识别常见编码并尝试解码。这东西的功能就像是一个自动密码学工具箱多试几次常常能歪打正着。需要特别提醒的是CTF里的flag形式有标准格式一般是flag{...}或者ctf{...}也可能用BZHW之类主办方自定义的前缀。如果你解码出来一堆乱码试着在乱码里搜flag或{很可能解码结果里掺了干扰数据flag片段是中间的一部分。还有一个技巧是看频率分布如果明文经过凯撒移位那字符频率大致符合英文频率你移位到最高频字符是e的位置往往就是对的。6. 综合实战复盘一道五层套娃题的完整解谜过程6.1 拿到文件后的第一反应与信息收集前面讲了很多单个知识点现在把它们串起来。我用一道我实际做过的模拟题来演示完整流程。题目给了一个文件challenge.jpg提示语只有一句话flag不止藏在一层。第一步我习惯先建一个工作目录把文件复制进去避免在原文件上操作改坏了没法恢复。第二步file challenge.jpg显示是JPEG图像数据。但是注意JPEG不一定只有一条数据流。我继续binwalk challenge.jpg输出显示在偏移0x2A4B附近有一个ZIP archive。这说明图片尾巴被拼接了一个ZIP压缩包也就是前面说的JPEGZIP文件拼接。我执行binwalk -e challenge.jpg自动提取得到了一个名为hidden.zip的文件。6.2 伪加密识别与修复细节file hidden.zip确认是ZIP后我先试直接unzip hidden.zip。结果提示需要密码。题目没给任何密码提示。根据我的经验这极可能是伪加密。我用十六进制编辑器打开hidden.zip搜索50 4B 03 04找到第一个本地文件头。在本地文件头的偏移4-5字节处看到了09 00说明通用位标志的第0位和第3位被置1。第3位其实表示使用数据描述符但第0位是加密标志。这里09的二进制是00001001第0位确实是1。但关键是要检查中央目录头同样位置是否一致。如果压缩包内容没有真实加密这个标志位就是人为改的。我直接用Python脚本将09 00修改为00 00再解压成功得到一个flag.txt文件。这说明判断正确。这个环节有个常见失误只修改了一个条目如果压缩包里有多个文件每个文件都有独立标志位可能只解出部分文件。所以修改完最好zipinfo fixed.zip看一下确认每个条目都不带加密标志flag.txt那行无E标记再解压。6.3 音频频谱里藏着第二层字符flag.txt打开后是一段话和一个音频文件链接内容是你还需要一双能看见声音的眼睛并附了audio.wav。这提示非常明显就是音频频谱隐写。我把audio.wav拖进Audacity切换到频谱图。播放音频能听到类似白噪音的声音但频谱图上有明显的字母痕迹。横轴是时间纵轴是频率字母分布在中低频区域。我仔细看了一下发现是一串十六进制字符串6A 75 73 74 5F 61 5F 66 6C 61 67。这串十六进制转ASCII后得到just_a_flag。但这个看起来不像最终flag更像是一把钥匙或一个提示。这时候我心里大概有数了后面应该还有一个用这个当密码的步骤。6.4 二维码提取与LSB叠加合并回到最初的图片challenge.jpg我还没仔细检查它的像素内容。我用zsteg -a challenge.jpg跑了一遍输出里有一行提示extract data from b1,rgb,lsb,xy输出是一张二维码的二进制数据。我将它保存为一个qr.bin研究发现它不是标准二维码而是只有一维的黑白条纹或者说是一张二维码的一部分。接着我想到题目说不止藏在一层会不会还藏了另一部分我再试zsteg的b1,bgr,lsb等不同组合果然另一组输出里又有一个二维码数据。两个都提取出来之后我写了个PIL脚本把它们逐像素异或结果拼出了一个完整的二维码。用手机一扫或者用zxing、zbar库得到字符串bowu{class_2_you_got_it}。等等这个bowu看起来像主办方的flag前缀但里面没有数字或下划线规律更像是一半flag。结合上一步音频得到的just_a_flag作为密码我猜还有个压缩包存在。于是回到hidden.zip解压出的文件里找是否有其他文件——果然还有一个/secret目录里面有个final.zip。我用just_a_flag作为密码解压final.zip成功得到一个flag_final.txt。打开一看内容并不是明文的flag{...}而是一串Brainfuck代码[-].---.....-----------..-...---...--..Brainfuck是CTF常客可以用在线Brainfuck解释器执行也可以丢给Python的brainfuck包。运行结果输出了最终flagflag{hidden_in_multiple_layers_is_fun}。6.5 整个过程复盘哪些步骤可以并联哪些必须串行这套题其实很有代表性。它把图片结构隐写JPEG尾部藏ZIP、压缩包伪加密、音频频谱隐写、图片LSB双重提取、二维码异或拼接、密码解压多层压缩包、Brainfuck编码全部串起来了。解题顺序上有一个很关键的点音频里解出的just_a_flag看似是最终答案其实是个钥匙这要求你在解出任何中间结果时先多问一句——这是flag吗如果不是它还能用来干什么很多时候Misc题里的中间信息就是下一层的钥匙。出题人不会无缘无故给你一个看似无关的字符串它一定是后续某一步的关键。另外某些步骤可以并联。比如在识别出challenge.jpg内含ZIP的同时就可以同时跑zsteg因为前者耗时短后者耗时可能久并行处理能压缩整体解题时间。我平时习惯开两个终端一个跑文件扫描一个跑图像隐写工具。7. 常见问题与排查技巧实录避坑指南7.1 工具报错、环境问题与文件损坏的排查问题一zsteg提示Errno 13 Permission denied。这个是你当前用户没权限读取文件或者文件路径错了。检查权限ls -l 文件加sudo或用chmod 644修复。有时候文件被占用也会这样关掉看图软件再试。问题二binwalk -e提取出的文件是空的或者只有几个字节。很可能是因为binwalk依赖的dd命令在提取时忽略了文件尾部偏移。改用foremost或者手动用dd切割先binwalk查看偏移然后dd ifchallenge.jpg ofhidden.zip bs1 skip0x2A4B试试。注意bs1会很慢可以bs1024然后skip$((0x2A4B / 1024))再修剪。问题三unzip报bad CRC或者解压出来文件打不开。如果是伪加密没彻底修复试试把标志位改成00 00后是否还报错。如果还报错考虑文件本身被篡改了。这时候把原始文件复制一份用7z x直接解压7-Zip对损坏zip的容忍度更高。问题四Audacity导入大音频卡死。WAV文件巨大时Audacity要加载全部采样点电脑内存不足会很卡。可以先用ffmpeg -i audio.wav -ar 8000 out.wav降采样再打开频谱图依然能看出字符图案。问题五strings输出太长刷屏找不到重点。先用strings 文件名 | grep -E flag|key|secret|password|ctf|BZHW过滤关键词再结合grep -n定位上下文。如果文件是二进制包加-t x显示偏移方便后续定位。7.2 解题思路上的误区与心态调整误区一死磕单一工具。我见过有人拿着StegSolve点了一个小时就为了把一张图的R/G/B通道手动对比结果用zsteg一行命令就出来了。工具之间是互补关系StegSolve适合看视觉效果zsteg适合批量穷举。同样strings扫不到不代表没有隐藏数据也许只是被压缩或加密了。误区二把有没有flag当作唯一目标。隐写题的中间产物常常不是flag而是一个压缩包、一段提示、一个密码。你解出的每一样东西都值得记下来包括看似无意义的字符串。出题人给的每一个线索都是有意义的只是可能藏在下一层。误区三不检查文件尾部。JPEG、PNG尾部加数据是简单又高频的出题方式。我遇到过一个题图片看着只有一个二维码但把图片拖进notepad打开尾部直接是flag{xxxx}明文。你strings一下就能看到完全不需要花哨操作。误区四面对Brainfuck之类的冷门编码直接放弃。我第一次遇到Brainfuck傻眼了这符号怎么是代码其实这类编码在CTF里就是纸老虎。你只需要把字符复制到CyberChef的From Brainfuck步骤或者在线解释器粘贴执行结果就出来了。关键是你要知道存在这种编码并且有工具能解。所以我平时会定期看Misc题库的writeup不是为了背答案而是为了扩充自己的编码知识面。心态上的一点建议隐写题做不出来是很正常的不用怀疑自己。合理的策略是先按通用流程跑跑不出来再回忆是否见过类似题型。我经常说Misc题最大的门槛是知识盲区——你不知道存在这种隐藏手法那就永远解不开。但一旦知道解题就是体力活。所以平时多刷writeup、多总结套路比临时抱佛脚强太多。8. 我的总结与进阶建议建立自己的隐写术排查手册做完这么多题我最大的感受是隐写术综合题考的并不是某个单一技巧的高难度而是你知道多少种隐藏方式 你有没有一套系统化的排查顺序。一个能把strings、binwalk、zsteg这三板斧用好的人已经能解掉七成的Misc题。如果想系统性进阶我建议你把自己的解题过程整理成一份私有排查手册。比如拿到文件后先看扩展名和真实类型用file、strings、binwalk、exiftool依次扫描如果是图片跑zsteg和StegSolve的通道分析如果是音频看频谱和波形重点看低频区域如果是压缩包先判断伪加密再看有没有小文件可以做CRC碰撞如果是流量包先看协议统计重点看HTTP和DNS最后所有线索串起来如果是一套多层的记下解出的所有字符串它们很可能互相是钥匙。我自己就是按这个思路每做一道新题都把新的隐藏手法补充到手册里。做了几十道之后再遇到新题脑子里会自动跳出这个像是XX套路。这种直觉就是刷题量换来的。最后再分享一个小技巧遇到解不出来的题不妨把文件用strings输出后存成文本然后用编辑器全局搜索flag{或者主办方前缀有时候答案就是明晃晃地躺在那里只是你之前没搜到。这句话听着像废话但在高压比赛现场人很容易陷入复杂化思维反而忘了最朴素的操作。把这篇复盘收藏好下次做隐写题的时候拿出来对照排查你会发现自己少走很多弯路。也欢迎你在评论区和我交流你遇到过的奇葩隐写手法——我至今还记得有一道题把flag藏在GIF的帧间差值里花了半小时才反应过来。这类经验都是靠踩坑换来的。
返回列表