上篇讲完了CTF杂项里那些“找线索、看压缩包、扫协议”的基础操作,这篇专门讲隐写术。隐写术在misc里属于存在感极强的板块,几乎每场CTF都会出好几道,说白了就是出题人把flag藏进一张图片、一段音频、一个压缩包甚至网络流量里,表面看着一切正常,实际信息藏在像素低位、频谱图、文件末尾或者某个冗余字段里。解题思路跟密码学不一样,密码学讲究算法识别和破解,隐写术更讲究“你知不知道这个文件格式能藏东西”“你舍不舍得把文件的每个字节都翻一遍”。这篇我把多年踩坑经验整理成一套能直接上手用的流程,从文件侦察、图片LSB、音频频谱、压缩包伪加密到流量包提取,每块都会给到工具选择、操作细节和避坑点,适合刚接触CTF想系统入门隐写题的选手,也适合刷了不少题但对某类技巧总缺一气的朋友。
1. 隐写术题型的底层逻辑
1.1 为什么misc里隐写术占比这么高
CTF misc的出题成本低,同时又特别考验选手的信息整理能力。一个无伤大雅的flag藏在图片右下角、塞进音频频谱、用LSB算法埋进像素,十几行脚本就能出一道题,但选手要找到它就得对文件格式、编码方式、常见工具有比较体系的认识。正因为这个特点,隐写题天然适合作为入门考核,也适合用来做难度梯度,从最基础的strings能直接看出来的题,到需要工具加脚本组合才能解出的题,跨度可以非常大。
说白了,隐写题的本质就是“藏”和“找”的对抗。出题人利用人对“正常文件”的固有认知做掩护,你看到的是一张风景照、一首音乐、一个能正常打开的压缩包,但信息就藏在那些你不会多看一眼的地方。解题人要做的是建立一套“文件解剖”的流程,把常规操作之外的冗余都挖出来。这套流程一旦熟练掌握,遇到绝大多数隐写题都能快速定位到考点方向。
1.2 隐写题的常规分类和大致的优先级
我把隐写题按载体分成五类,分类的重要性在于你能快速缩小排查范围。
| 载体类型 | 常见隐藏方式 | 典型工具/命令 | 难度参考 |
|---|---|---|---|
| 图片 | 元数据、LSB、DCT系数、附加文件、像素信息 | exiftool、StegSolve、zsteg、binwalk | 低到高 |
| 音频 | 频谱图、波形、LSB、语速变化、声道差异 | Audacity、MP3Stego、WavSteg | 中 |
| 视频 | 帧序列提取、时间轴隐写、音频轨 | ffmpeg、ffprobe | 中 |
| 压缩包 | 伪加密、注释、附加数据、CRC爆破 | 7z、ZipCenOp、bkcrack、python脚本 | 低到中 |
| 流量包 | 协议分析、对象导出、可疑字段 | Wireshark、tshark、NetworkMiner | 中到高 |
实际做题优先级建议是:先看文件类型和大小,再跑一次常规字符串提取,接着上binwalk扫描附加文件,然后才进入具体载体的深度分析。不要一上来就跑LSB脚本,很多简单题其实靠strings或者看文件末尾就能解决,顺序反了纯属浪费时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开局三板斧:文件和字符串侦察
2.1 file、strings、binwalk 的正确打开方式
这三条命令是隐写题的常规起手式,但很多人用得不仔细,导致漏掉关键信息。
先强制看作死步骤,拿到附件先file确认真实类型。出题人常用的手法是改后缀名,比如把一个zip改成png,你在Windows下双击报错,但file能直接告诉你它其实是Zip archive。这一点在入门题里出现频率极高,我见过太多人卡在“图片打不开”上,其实改成.zip后缀解压就能看到flag。file输出里的“data”类型也很值得注意,说明这个文件可能被处理过,或者整体被加密了。
strings命令建议加-n参数,比如strings -n 8 flag.png,只输出长度不少于8的字符串,可以有效过滤掉图片二进制里的噪声。图片类文件我一般还会再加-a扫描整个文件而不是默认的只扫数据段,有些藏在文件头或者文件尾的文本,不加-a可能扫不到。跑完之后重点看有没有flag{、ctf、key、http、base64特征的片段。
然后是binwalk,这个工具的定位是检测并提取文件中的嵌入式文件,底层依赖文件签名数据库。经典用法:
bash复制binwalk flag.png
binwalk -e flag.png
第一行列出扫描结果,第二行自动提取。需要注意两点:一是binwalk输出也可能被出题人干扰,比如在文件里塞入伪造的PNG头来误导你,所以结合file和十六进制查看来判断它报出的offset是否可信;二是-e提取失败时试试--dd参数按类型强行切分,或者用foremost、dd手动根据偏移截取。我实际比赛里遇到过binwalk识别了但提取不完整的情况,后来手工对照十六进制偏移把文件抠出来才解出来,这种情况在复杂题目里不算罕见。
2.2 文件伪装、拼接与分离的实战套路
文件伪装不只是改后缀名,还可能是文件头被破坏。常见手法是修改PNG的头几个字节,比如把89 50 4E 47改成00 50 4E 47,图片就打不开了。这种情况要会用十六进制编辑器修复文件头,工具可以用010 Editor或者HxD。判断方法是看文件扩展名和实际内容的差异,以及文件大小是否合理。
还有一种很经典的多文件拼接,一个看起来正常的图片文件,末尾直接接了一个压缩包。binwalk大部分时候能发现,但要养成用dd手动切割的习惯,比如binwalk报出ZIP在偏移0x123456,可以用下面的命令把它切出来:
bash复制dd if=flag.png of=extracted.zip bs=1 skip=$((0x123456))
bs=1意味着逐字节读取,速度慢但准确。如果文件很大,可以先用binwalk的偏移结果估算,或者用grep -aob "PK" flag.png直接搜索ZIP的魔数PK。这个思路不仅适用于图片和压缩包拼接,任何已知文件签名都可以用grep -aob来定位,然后把对应区域切出来。
拆完文件后,接下来要习惯性地检查文件末尾。图片末尾经常被塞入一串base64、一整段flag文本甚至另一个完整文件。用tail -c 200 flag.png | xxd看看最后200字节的内容,很多简单题就藏在里面。这个习惯的价值在于,它能快速过滤掉一批“送分题”,让你把精力留给真正有难度的部分。
3. 图片隐写深度拆解
3.1 元数据与PNG块结构
图片是隐写题的第一大载体,其中最简单的一档是元数据隐写。用exiftool一条命令就能看到图片的EXIF信息、注释、作者、GPS坐标等字段,出题人常常把flag明文放在Comment、Artist、ImageDescription、Software这些字段里。入门选手最容易漏掉的是PNG的tEXt、iTXt块,这些块在exiftool里不一定显示得很明显,更好的方式是去查看PNG的块结构。
PNG文件由8字节签名加多个数据块构成,常见块有IHDR、IDAT、IEND,每个块都有自己的类型名。如果多出一个不认识的块,比如eXIf、tEXt、iTXt,就值得好好看看。可以用pngcheck检查PNG的块列表,也可以自己用xxd配合偏移量人工看。另一个常见玩法是,图片实际尺寸比显示尺寸大,用pngcheck -v能看到图片的宽高字段,宽高被改小后图片只显示一部分,剩下的部分往往藏着信息。这时候需要修改IHDR里的Width/Height字段,常见做法是把高度值改大,工具可以用pngcheck -v先确认真实尺寸,再在十六进制编辑器里找到IHDR对应的宽高参数修改。
bash复制pngcheck -v flag.png
还有一个我在比赛里遇到的细节,GIF图每帧的延迟可以不同,出题人把信息编码进帧延迟里,播放时看起来只是快慢不同,但解析帧间隔就能还原出二进制。这种情况identify(ImageMagick)加-verbose可以查看每帧延迟,再把延迟值转成ASCII或者二进制。
3.2 LSB隐写与 StegSolve 的使用
LSB(Least Significant Bit)是图片隐写里最核心的考点。原理是图片每个像素的RGB分量都是由8位二进制表示的,修改最低位对视觉效果几乎无影响,却可以逐位存储信息。8个像素就能藏一个英文字母,一张1080p的图理论上能藏几十KB。
针对LSB题,我首推StegSolve,操作路径是Analyse > Bit Planes。这个工具会把图片按位平面拆开,分别显示R、G、B三个通道的第0位到第7位,如果某个平面出现明显的图案或者文本,说明信息藏在对应的通道位里。一般看到位平面上有规律的文字轮廓时,就可以用Data Extract功能直接提取。
另一个更自动化的工具是zsteg,它是专门检测PNG和BMP中LSB隐写的命令行工具,支持常见的隐藏算法:
bash复制zsteg -a flag.png
-a参数表示尝试所有已知方法,输出里如果出现b1,rgb,lsb,xy这样的行,并且后面跟着可读文本,那就基本石锤了。zsteg也能检测OpenStego、Camouflage这类工具的产物,覆盖面够广。不过它不是万能的,遇到自定义LSB算法时还是得回到StegSolve手工看位平面。
如果题目明确说了用了StegHide,那就不能用zsteg了。StegHide是把任意文件藏进图片或音频的高强度隐写工具,特点是藏入后图片视觉变化几乎不可感知,但无法直接通过位平面看到信息。破解方向通常是密码爆破,常用的有stegcracker和stegexpose:
bash复制stegcracker flag.png /usr/share/wordlists/rockyou.txt
stegseek flag.png rockyou.txt
如果解压出来的是key文件,那可能后面还要配合其他载体做双重隐写。做题时务必要留意题目描述里有没有暗示密码,比如“生日”“四位数字”之类,直接套字典往往不如人工猜一个来的快。
3.3 其他图片隐写方向
除了LSB和元数据,图片隐写还有几个值得留意的方向。
一是调色板隐写,常见于GIF和PNG-8,原理是修改调色板里相近颜色的顺序或者RGB值来编码信息。工具上可以用stegsolve的Colour Map或GifShuffle。判断特征是图片颜色数较少,文件大小和图片尺寸不匹配。
二是JPEG的DCT系数隐写,这块比LSB高端一些。JPEG经过离散余弦变换后,频域系数可以被微调以嵌入数据,JSteg、OutGuess、F5都是这类工具。检测和提取相对复杂,常见做法是先用stegdetect看看是否有隐写痕迹,再用对应工具跑。但实战中DCT隐写的出现频率远低于PNG的LSB,新手不需要过度纠结,知道有这个方向,遇到JPEG且常规操作一无所获时再往这里查。
三是基于像素值分析的图像匹配。有时候两张图看起来完全一样,但通过对两张图做差异分析,比如在StegSolve里Analyse > Image Combiner,把两张图做SUB或者XOR,就能得到藏在差异中的信息。这种题型思路比较朴素,适合那种“两张图一模一样但大小不同”的题目。
我常用的一个操作是批量遍历所有像素通道做异或。比如有两张图a.png和b.png,用Python和PIL可以快速对比:
python复制from PIL import Image
import numpy as np
img1 = np.array(Image.open('a.png'))
img2 = np.array(Image.open('b.png'))
diff = np.abs(img1.astype(int) - img2.astype(int))
Image.fromarray(np.uint8(diff)).save('diff.png')
保存下来的diff图里如果出现白色文字轮廓,说明信息就在像素差异中。这个脚本我几乎每场比赛都会用,写一次能省以后很多功夫。
4. 音频与视频里的隐藏信息
4.1 频谱图与语速变速
音频隐写在misc里属于中等难度的分支,最经典的解法是看频谱图。很多人第一次看到频谱图里出现一排文字时都觉得很神奇,其实原理简单:把信息以图像形式绘制到声音的频域上,播放时人耳听起来只是有点噪声,但打开频谱视图就能看到文字。
工具首选Audacity,打开音频文件后,把视图模式切到频谱图(Spectrogram)。快捷键是Shift + M,或者通过菜单查看 > 频谱图。如果频谱图里颜色深的地方构成了可读的图案,就把窗口拉大、把频率范围调窄,有时候文字藏在比较窄的频带里,默认视图看不清。我遇到过一次flag藏在22kHz附近的频率区间,那是人耳几乎听不到的高频段,靠听完全无法发现,只有把频谱图的频率上限拉高才能看到。
还有一种变速隐写:把音频播放速度调慢或者调快,就会听到一段类似SSTV或者慢速电报的嘟嘟声。CTF里最常见的是SSTV(慢扫描电视),用RX-SSTV或QSSTV可以把音频解码成图片。我曾经做过一道题,音频本来是一段正常的钢琴曲,把播放速度放慢16倍后才听到SSTV信号,再用解码器还原出二维码。所以遇到“听起来有杂音”的音频,除了看频谱图,还要试试变速播放。Audacity里效果 > 变速就能调整,也可以用ffmpeg做:
bash复制ffmpeg -i flag.mp3 -filter:a "atempo=0.5" slow.wav
4.2 音频LSB与双声道分析
音频也能做LSB隐写,原理和图片LSB类似,修改WAV采样值的最低位来隐藏信息。这类题通常给你一个WAV文件,播放起来听起来是白噪音或者被处理过的旋律。工具上可以用WavSteg、Steghide、stegpy,但很多时候需要自己写Python读取WAV的样本数据。
简单的读取思路是这样的:WAV文件包含一系列16位或8位的采样值,把每个采样值的最低位取出来,再按位拼成字节,就是隐藏的二进制数据。可以快速用Python验证:
python复制import wave
import struct
wav = wave.open('flag.wav', 'rb')
frames = wav.readframes(wav.getnframes())
bits = ''
for i in range(0, len(frames), 2):
sample = struct.unpack('<H', frames[i:i+2])[0]
bits += str(sample & 1)
把bits每8位一组转成字符,看到可读文本就说明找到了。音频LSB的一个特点是最低位提取出的数据可能整体是倒序或者反向的,我做过一道题需要把比特流反过来再解码,这种细节要靠对输出结果的敏感度来判断。
双声道分析不太常见但偶尔出现。左右声道其中一个藏入了摩斯电码或者二进制序列,用Audacity把声道分离,分别看波形或者频谱,可能就会看到一个声道里存在明显的有规律脉冲。把脉冲的间隔转成莫斯码是常见考点,我习惯先把波形视图放大,用肉眼读取长短间隔,再用在线工具转文本。当然,读取莫斯码也可以写一个自动分析脚本,但大部分题目不会出得太复杂,手动看波形往往更快。
5. 压缩包与加密的潜规则
5.1 ZIP伪加密的判断与破解
压缩包类是misc里最实在的考点,因为结构清楚、手法固定,掌握之后基本是稳定拿分项。ZIP伪加密是最常见的:压缩包用常规方式打开时会提示需要密码,但实际文件并没有真正加密,只是修改了ZIP文件头里的某个标志位,让解压软件误以为有密码。
怎么判断伪加密?用file看类型看不出,需要打开十六进制看看ZIP的通用位标志(general purpose bit flag)。ZIP的本地文件头(local file header)和中央目录文件头(central directory header)里都有一个2字节的通用位标志,如果第0位(bit 0)为1,表示文件被加密。伪加密的操作通常是把中央目录头里的加密标志置为1,但本地文件头不变,或者反过来。检测工具可以用ZipCenOp:
bash复制java -jar ZipCenOp.jar r flag.zip
r参数是恢复伪加密。如果跑完后文件能直接解压出内容,那就确认是伪加密。Windows下也可以用7-Zip打开测试,提示输入密码但密码随便输入一个空密码就能解开的,多数是伪加密。
但要注意,ZipCenOp对某些变种不够用,比如加密标志被改在本地文件头,或者文件有多个分卷。这种情况就用010 Editor或HxD手动把加密标志位从09 00改成00 00,或者反过来在中央目录头里把01 00改成00 00。修复后如果文件可以解压了,说明原文件是伪加密;如果修复后依然要求密码,那就进入真加密爆破流程。
真加密的破解手段有几个方向。弱口令优先跑字典,工具可以用fcrackzip或john:
bash复制fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt flag.zip
如果ZIP里的文件内容已知一部分,比如压缩包内某个文件你在题目描述里知道开头几个字节,那就试试ZIP明文攻击,用bkcrack:
bash复制bkcrack -C flag.zip -c ciphertext.txt -p plaintext.txt
明文攻击的思路是,ZIP的加密算法本质是流密码,知道一段明文和对应密文,就能恢复内部密钥,进而解密整个压缩包。这在赛题里用于那种“压缩包里有多个文件,其中一个文件内容被公开或者可以猜到”的情况,属于比较进阶的解法,但值得备着。
5.2 压缩包注释与其他后门
压缩包伪加密之外,ZIP的注释字段也是个容易藏flag的地方。用7-Zip打开压缩包,右侧窗口会显示注释信息,或者用命令行直接读取:
bash复制zipinfo -v flag.zip
注释字段可能是base64字符串、倒序文本或者一段提示密码的口令。我见过一道题,注释写着“密码是FLAG的前四位加年份”,看到这种提示就知道下一步怎么做了。
还要留意压缩包内的文件名,有些题目把flag直接拆开,一部分塞进文件名,一部分塞进文件内容,解压完不能只看内容,文件名本身也要仔细读。文件名里可能出现URL编码、unicode反转义或者极隐蔽的大小写变化,这种情况我会把所有文件名拷贝出来放进文本编辑器里逐个字符检查。
另一个常见操作是把压缩包拖进十六进制编辑器,搜索flag、ctf、key等关键词。虽然听起来很土,但出题人有时候会高估自己的隐藏技巧,把明文flag留在压缩包的结构数据里没清理干净。用grep -aob "flag" flag.zip就能快速定位。这个技巧对任何文件都适用,流量包、图片、压缩包都能用,我每次拿到附件第一件事就是把它跑一遍。
6. 流量包和协议隐写
6.1 流量包场景分级
流量包分析是misc里面最能拉开差距的题型,特点是给定一个.pcap或.pcapng文件,让你在里面找交互的敏感信息。流量分析可以分为三个层次:第一层是直接用Wireshark看HTTP会话,找POST请求里的参数;第二层是追踪TCP流,把乱序的传输数据整理还原;第三层是协议级隐写,信息藏在协议字段的细微差异里,比如TTL值、TCP窗口大小、IP标识字段。CTF题目大多数集中在第一和第二层,第三层需要一点协议知识储备,但做起来也不复杂。
拿到pcap后,我习惯先用tshark统计一下流量概览:
bash复制tshark -r capture.pcap -z io,phs
这条命令会列出各层协议的使用情况,一眼就能看出流量主要是HTTP、DNS还是USB协议。不同协议的关注点完全不同。HTTP流量看URL、表单、Cookie、Authorization头;DNS流量看查询域名的规律性,有没有可能是编码过的数据;USB流量在看键盘敲击记录时是最经典的考点,人机交互设备的报告数据可以还原出按键顺序。
6.2 常用过滤器与提取技巧
Wireshark里有两个功能必须熟练:导出对象和追踪TCP流。菜单文件 > 导出对象 > HTTP,可以把流量里传输的文件全部导出来。题目里最常见的套路是服务器返回了一张图片,图片里藏着flag,但流量包是pcap格式,很多人不知道怎么把它还原出来。用导出对象直接搞定。
追踪TCP流时注意流量可能被分段,需要右键TCP流,选择Follow TCP Stream,把数据保存成原始格式。有些时候flag是被hex编码后放在请求里的,这时候Wireshark里显示的是乱码,需要在导出原始数据后用xxd -r反转回来。
还有一个高频点是USB键盘流量。用Wireshark打开,过滤规则是usbhid.data或usb.capdata。键盘设备每次按键会产生8字节的报告包,其中第3个字节是按键的HID码。解题思路是把所有报告包里的HID码提取出来,再映射到对应的字母。虽然用手工查表也能解,但数据量大时效率太低,我一般用脚本来做:
python复制mapping = {0x04: 'a', 0x05: 'b', 0x1e: '1'}
data = open('usb.data').read().split('\n')
for line in data:
hid = int(line.split(':')[1], 16)
if hid in mapping:
print(mapping[hid], end='')
遇到一个USB数据包无法提取出按键值的情况,往往是出题人故意插入了干扰包,这时候需要在脚本里记录时间戳,找出那些与前后时间不连续的数据包。或者使用现成的工具UsbKeyboardDataHacker,能省不少事。
还有一类流量题喜欢用DNS隧道或者ICMP隧道来传输隐藏信息。DNS查询的域名部分是按.分隔的,每段都是一个可见字符串,多个查询拼接起来就是完整的base64。ICMP隧道则是把数据填充到ICMP echo请求的data字段里。这类题在Wireshark里用icmp过滤,直接看每个包的data部分,很容易拼出隐藏内容。
7. 一次完整的隐写解题流程复盘
说了这么多工具和技巧,我用一道虚拟的题目把完整流程串一遍。假设拿到一个文件叫final.png,大小3MB,看起来是一张普通风景图,但题目提示说“仔细看看,不止一张图”。
拿到附件的第一个动作,我依次执行file、strings -a -n 8和binwalk。file显示这是PNG图片,正常打开也没问题。strings没看到flag特征。但binwalk结果里发现了两处可疑的签名:一个PNG在偏移0x000A1B2C,一个ZIP在偏移0x0018D3E4。这说明文件里拼了东西。
用dd把ZIP部分切出来,尝试解压。输入密码时被要求密码,但注意到压缩包注释写着“password is md5(flag) without null”。思考一下,flag本身都没找出来,说明流程还没走完,先去处理PNG部分。
用pngcheck -v final.png检查块结构,发现IHDR显示的宽高是800x600,但在文件末尾又出现了一个tEXt块和一个多余的IDAT块。文本块的内容是一段base64,解码后得到一串数字“00 01 00 01 0A 0B 0C 0D 0E 0F...”。观察它的规律,和PNG IHDR的尺寸参数字段很像,于是推断出题人可能修改了图片的实际高度,让图只显示上半部分,下半部分藏着另一张图。
在十六进制编辑器里找到IHDR的Height字段,改大数值保存。重新打开图片,果然下半部分出现了一串按像素排列的字符串:K3V5RFHB9LQ。尝试用base32解码,得到类似乱码,再尝试base58,解码出来是一段英文句子,句子中间夹着flag{look_beyond_pixels_2024}。
拿到flag之后再去解ZIP,注释里说要md5(flag)作为密码。对整段flag计算MD5,作为ZIP密码解压,得到一份writeup和一张写着“ThisIsTheEnd”的图片。回头再看,ZIP里的图片其实是干扰项,真正的玄机在压缩包注释的提示里——它能引导你把PNG的宽高修改成正确值。这类多段式隐写题在正规比赛里越来越常见,考察的不只是单个工具,更是流程的完整性。
8. 隐写工具箱与团队协作建议
8.1 一份够用的工具清单
我把平时常驻的隐写工具整理成了一张表,按使用频率排序。不是说工具越多越好,而是要把最常用的那几个练到肌肉记忆。
| 用途 | 工具/命令 | 关键参数或操作 |
|---|---|---|
| 文件侦察 | file、binwalk、foremost、strings |
binwalk -e,strings -a -n 8 |
| 十六进制查看 | 010 Editor、HxD、xxd |
搜索ASCII字符串、魔数 |
| 图片信息 | exiftool、pngcheck |
-a、-v参数 |
| 图片LSB | StegSolve、zsteg、StegHide | zsteg -a,位平面检测 |
| 隐写暴力破解 | stegcracker、stegseek |
配合字典使用 |
| 音频分析 | Audacity、RX-SSTV、MP3Stego | 频谱图、变速、频带 |
| 压缩包检测 | ZipCenOp、bkcrack、fcrackzip |
伪加密修复、明文攻击 |
| 流量分析 | Wireshark、tshark、NetworkMiner | 导出对象、过滤USB/HID |
| 格式转换 | xxd、base64、python3 |
批量脚本处理 |
你要想省事,可以直接用网上打包好的CTF工具集,比如随波逐流CTF编码工具这类合集工具,里面集成了编码转换、加解密、哈希爆破、隐写检测等多种功能,日常做题完全够用。但我不建议完全依赖图形界面工具,命令行工具在比赛服务器上跑起来更快,而且更能帮你理解数据处理的细节。
8.2 踩出来的几条实战经验
最后分享几个我自己的经验。
第一,别忽略题目描述。隐写题经常在题目描述里给出口令提示、类型提示甚至算法提示。有的题明确写了“password is 4 digits”,你却抱着rockyou字典爆破半天,纯属和自己过不去。认真读题永远是第一步。
第二,文件大小是极其重要的线索。一张正常的图片不会莫名其妙多出几十KB,一段30秒的MP3也不会无故变成几百MB。拿到附件先看大小,如果文件特别大,优先怀疑附带了其他文件;特别小则可能全是关键信息没有冗余。
第三,工具扫不到不代表没有,换个思路再查。zsteg扫不出LSB,不代表没有LSB,可能是顺序或者掩码不同。binwalk扫不到附加文件,不代表没有附加文件,可能是文件头被有意破坏了。此时回到十六进制手工查看是一个可靠的退路。
第四,多做横向整理,把做过的题按“载体+隐藏方式+工具”三个维度记笔记。我自己的笔记有几百条,每次遇到新题都会先翻一遍笔记,看看是否有相似案例。这比盲目尝试效率高得多,特别是面对那些换汤不换药的改编题。
隐写术这门手艺,说到底是观察力和耐心的较量。工具是死的,思路是活的,流程感和细节敏感度才是真正的核心竞争力。希望这篇总结能帮你把杂项里隐写这一支打通,下次在比赛里看到“平平无奇”的图片或者音频时,能有底气说出“让我来拆一下”。
