</p>
<p>将图片文件和压缩包(ZIP/RAR)拼接在一起,图片查看器看到的是图片,但用解压工具打开时识别到的是Zip文件。这是CTF中最经典的入门级隐写手法。</p>
<div class=)
# 图片隐写合并Windows: copy /b normal.jpg + secret.zip output.jpgLinux: cat normal.jpg secret.zip > output.jpg# 提取工具binwalk output.jpgforemost output.jpg# dd手动分离dd if=output.jpg of=extracted.zip bs=1 skip=偏移量
▎ EXIF元数据信息
JPEG图片中存储的EXIF(可交换图像文件格式)数据,可能包含GPS坐标、相机型号、拍摄时间等元信息。CTF中有时Flag就直接写在EXIF里。
# EXIF查看exiftool image.jpg# 字符串检索strings image.jpg | grep -i \"flag\\|ctf\\|secret\"# Python读取EXIFfrom PIL import Imageimg = Image.open(\"image.jpg\")print(img._getexif())
三、LSB隐写详解
LSB(Least Significant Bit,最低有效位)是最基础也最高频的隐写手法。每个像素由R、G、B三个字节组成(24位真彩色),修改每个字节的最低位(即最低1个比特),人眼根本无法察觉颜色变化,却能存储大量信息。一张1920×1080的图片,LSB隐写可存储约1920×1080×3÷8 ≈ 777,600字节(约760KB)的秘密数据。
LSB隐写的提取方式有两种:按行扫描(从上到下、从左到右提取每个像素的LSB)和按颜色通道提取(分别提取R/G/B通道的LSB信息)。Stegsolve工具可以非常方便地完成这些操作。 ▎ Stegsolve工具详解
Stegsolve是CTFer人手必备的图片隐写分析工具,基于Java开发。它的核心功能包括:
# Stegsolve启动java -jar stegsolve.jar# 基础操作1. File->Open 载入图片2. 左右箭头切换RGB/Alpha通道3. Analyse->Data Extract LSB提取4. Bit Order: LSB First/MSB First5. Plane: RGB/BGR/RGBA6. Preview预览,出现flag即成功
▎ Python手动实现LSB提取
理解LSB原理后,用Python手动实现能加深认识。核心思路:加载图片像素矩阵,提取每个颜色通道的最低位,拼接成二进制数据后转回ASCII。
from PIL import Imagedef extract_lsb(p): img=Image.open(p) pix=img.load() b=[] for y in range(img.height): for x in range(img.width): r,g,b=pix[x,y][:3] b+=str(r&1),str(g&1),str(b&1) s=\"\".join(b) return \"\".join([chr(int(s[i:i+8],2)) for i in range(0,len(s)-7,8)])print(extract_lsb(\"stego.png\"))
四、音频隐写
音频隐写在CTF中虽然没有图片隐写常见,但几乎是每场大赛的\"必出题型\"。最典型的两种手法:频谱隐写和波形隐写。 ▎ 频谱隐写(Spectrogram)
频谱隐写是将文字或二维码隐藏在音频文件的频谱图中。用Audacity打开音频文件,切换到频谱图视图(Spectrogram),就能看到隐藏在频域中的图案——通常是一个二维码或一串文字。
# Audacity音频隐写频谱查看1. File->Open 载入音频2. 选中轨道,左侧切换Spectrogram频谱图3. Settings->Scale->Linear4. 调整Window Size窗口大小5. 出现二维码截图扫码获取flag
▎ 波形隐写与摩斯电码 有些音频隐写将信息编码为摩斯电码形式的嘀嗒声,或通过波形的振幅变化来编码二进制数据。用Audacity查看波形图,识别出长音(-)和短音(.)即可还原出摩斯电码。
# 摩斯解码在线工具:https://morsecode.world/international/decoder/audio-decoder-adaptive.html.-=A -...=B -.-.=C -..=D.=E ..-.=F --.=G ....=H..=I .---=J -.-=K .-..=L--=M -.=N ---=O .--.=P--.-=Q .-.=R ...=S -=T..-=U ...-=V .--=W -..-=X-.--=Y --..=Z
五、文件隐藏与分离
很多CTF隐写题会将多个文件拼接在一起(如图片尾部附加ZIP、ZIP中嵌套其他文件),需要专门的工具来检测和分离。掌握以下工具能应对绝大部分文件分离场景。
# binwalkbinwalk mystery.pngbinwalk -e mystery.png# foremostforemost -i mystery.png -o output/# 字符串检索strings mystery.png | grep -i \"flag\\|ctf\\|{\"# zsteg LSB隐写zsteg -a mystery.png# 查看文件尾部tail -c 1000 mystery.png | xxdstrings mystery.png | tail -20
六、隐写常用工具速查
| 工具 | 适用场景 | 下载/安装 |
|---|---|---|
| Stegsolve | 图片通道分析/LSB提取 | GitHub搜索stegsolve.jar |
| zsteg | PNG/BMP自动LSB检测 | gem install zsteg |
| binwalk | 固件/文件嵌入式分析 | apt install binwalk |
| foremost | 按文件头分离文件 | apt install foremost |
| Audacity | 音频波形/频谱分析 | apt install audacity |
| exiftool | EXIF元数据提取 | apt install libimage-exiftool-perl |
| strings | 提取文件中可见字符串 | 内置(binutils) |
| 010 Editor | 十六进制编辑器 | 商业软件/在线试用 |
常见踩坑 ❌ 只检查文件扩展名,不检查文件头 — 文件可能被改后缀
❌ Stegsolve只遍历RGB通道,漏掉了Alpha通道或灰度位图
❌ 音频文件只听了声音没看频谱图 — 漏掉频谱隐写
❌ 找到可疑数据但没注意提取顺序(Bit Order / Plan Order)
❌ 忘记检查图片尾部是否有附加文件(用tail -c看最后几百字节)
防守要点 企业应阻止员工在网络中传输未经审核的图片/音频文件
对敏感文件的图片输出做LSB清洗(随机化最低位)
文件上传功能应检查文件头与扩展名是否一致
使用内容安全检测系统扫描上传文件中的嵌入式数据
觉得有用?点个在看支持一下
下期预告:取证分析 — 内存取证、磁盘取证、流量分析、Volatility实战。初学者也能上手的数字取证全流程。










评论