MISC入门---图片隐写
MISC入门:图片隐写(Steganography)
前言
在CTF比赛中,MISC(杂项) 题目常常以“看似无害”的文件出现——比如一张可爱的猫咪图片、一段普通的音频。但别被表象迷惑!这些文件中可能藏着你梦寐以求的 flag。
其中最常见的一种技巧就是:图片隐写术(Image Steganography)。
本文专为 CTF新手 设计,带你从零认识什么是图片隐写,掌握常用工具和解题思路,让你轻松破解第一道隐写题!
什么是图片隐写?
隐写术(Steganography)
隐写术是一种将信息隐藏在其他媒介中的技术,目标是“让别人看不出有秘密”。图⽚隐写之所以成为MISC的常客,是因为它完美模拟了现实中的信息隐藏场景——⿊客可能通 过社交媒体图⽚传递指令,间谍可能在旅游照⽚中嵌⼊机密数据。2023年某真实APT攻击事件 中,攻击者正是利⽤PNG图⽚的EXIF信息传递C2服务器地址,这与CTF题⽬如出⼀辙。
与加密不同,加密是让人看懂但看不懂内容,而隐写是让人根本不知道有信息存在。
图片为什么能藏数据?
一张图片由大量像素点组成,每个像素包含颜色信息(如RGB值)。我们可以通过微调这些颜色值来嵌入数据,人眼几乎无法察觉变化。
例如:
- 修改最低有效位(LSB)
- 在文件末尾追加压缩包
- 利用图片元数据(EXIF)
- 使用特定工具加密嵌入
出题人常把 flag 藏在
.jpg、.png、.bmp等图片中。
图像文件的秘密结构
所有数字图⽚本质上都是"披着像素外⾐的数据流"。以最常⻅的PNG和JPEG格式为例:
PNG⽂件:由⽂件签名(8字节)、多个数据块(Chunk)组成,每个Chunk包含⻓度、类 型、数据和CRC校验。其中IEND块之后的区域通常被⽤于隐藏数据,就像快递盒⾥的"夹 层"。
JPEG⽂件:采⽤分段结构,以0xFFD8开头,0xFFD9结尾。在这两个标记之间,存在⼤量 可⽤于隐写的空间,尤其是注释段(0xFFFE)和量化表区域。
新手必知的5种图片隐写方式
| 类型 | 特征 | 工具 |
|---|---|---|
| 1. LSB隐写(最低有效位) | 改变像素最后一位,视觉无变化 | stegsolve, zsteg |
| 2. 文件追加(附加数据) | 图片后面拼接了ZIP或其他文件 | binwalk, foremost |
| 3. 元数据隐藏 | EXIF信息中藏文字或flag | exiftool |
| 4. Steghide嵌入 | 使用密码保护的隐写工具 | steghide |
| 5. 图片修复类 | 文件头损坏、多图合并等 | 010 Editor, 手动修复 |
下面我们逐一讲解!
1. 文件追加型隐写 —— 最常见的套路!
原理:
把一个压缩包(如 .zip 或 .txt)直接拼接到图片文件末尾:
看起来还是正常图片,但实际后面藏着另一个文件。
如何发现?
以[NISACTF 2022]huaji?为例
下载附件得到一个名为huaji?的文件,使用010打开

可以发现这是一个JPG文件,于是我们修改后缀,可以得到一张图片
使用 binwalk 分析文件结构:
binwalk filename.jpg
输出示例:
DECIMAL HEXADECIMAL DESCRIPTION
-----------------------------------------
0 0x0 JPEG image data
34782 0x87DE Zip archive data
发现后面有 ZIP 文件!说明很可能有隐藏内容。

🔧 提取方法:
方法一:使用 binwalk -e
binwalk -e filename.jpg

这样我们即可拿到图片中隐藏的压缩包
方法二:手动分离

这是直接使用010进行提取,复制到新的十六进制文件即可得到压缩包
2. 元数据隐藏(EXIF信息)
什么是EXIF?
EXIF(Exchangeable Image File Format)是照片中记录拍摄信息的数据,比如相机型号、时间、GPS位置等。⼿机拍照时会⾃动记录相机型号、GPS位置、拍摄时间等元数据,这些信息存储在EXIF区块中。 攻击者可以在这些字段中嵌⼊Base64编码的秘密信息,普通⽤⼾查看图⽚时根本不会注意到这些"数字⽔印"。
出题人可以在里面添加自定义字段藏 flag。
查看方法:
使用 exiftool:
exiftool photo.jpg
输出可能包含:
Author : flag{exif_is_not_safe}
Comment : Hidden message here
解决方案:
直接查看所有元数据,搜索 flag{ 或可疑字符串即可。
3. Steghide 工具隐写(带密码)
⚙️ 什么是Steghide?
steghide 是一款强大的隐写工具,可以将任意文件嵌入 JPEG/BMP 图像中,并支持密码保护。
嵌入示例(出题人操作):
steghide embed -cf image.jpg -ef secret.txt -p "ctf2025"
如何检测?
先用 file 和 binwalk 检查是否有异常。
然后尝试提取:
steghide extract -sf image.jpg
会提示输入密码。
密码怎么找?
- 尝试空密码(直接回车)
- 查看图片名、作者、注释等线索
- 使用字典爆破:
stegcracker image.jpg /usr/share/wordlists/rockyou.txt
🛠️ 工具推荐:
stegcracker(自动爆破工具)
4. LSB隐写(最低有效位)
原理简介:
每个像素颜色值是一个8位二进制数,例如红色分量:11001011
改变最后一位(LSB),变成 11001010,人眼几乎看不出区别。
这是最经典的隐写⽅法,原理简单粗暴:将秘密信息的⼆进制位替换像素RGB值的最低位。
可以用这些“最后一位”拼成一个新的文件(如文本、图片)。
常见场景:
- PNG/BMP 图片中隐藏文本或二维码
- 多帧图像组合成新图(逐帧提取LSB)
GIF抽帧
有时候我们下载附件会得到一个GIF,这时候我们的一般思路是进行抽帧,将每一帧分离出来再进行下一步操作
以BUUCTF中题目金三胖为例,下载附件我们会得到一个名为aaa.gif的动图

我们进行抽帧,即可在分离的帧下拼接出flag
StegSolve
StegSolve是图⽚隐写的"瑞⼠军⼑",尤其擅⻓LSB隐写分析。让我们通过⼀个实际案例看看它的⽤法:
以BUUCTF中题目LSB为例,下载附件,我们得到一张png图片

进行提取我们可以看到另一张图片

🔧 推荐工具:
zsteg(专用于PNG/BMP)
zsteg是针对PNG图⽚的专业隐写⼯具,功能强⼤到令⼈惊叹。它能⾃动检测24种不同的隐写⽅法,⽀持从各种位平⾯组合中提取数据
zsteg image.png
自动扫描多种LSB模式,输出隐藏内容。

使用zsteg一把梭也可以看到隐藏的png文件
5. 图片修复类题目
有时图片本身无法打开,提示“文件损坏”,其实是故意修改了文件头。
🔍 常见问题:
| 问题 | 解决方法 |
|---|---|
.jpg 实际是 .png |
修改扩展名或修复头 |
| 文件头被篡改 | 用十六进制编辑器修复 |
| 多张图合并 | 分离后分别处理 |
🔧 工具推荐:
file 命令识别真实类型
file broken.jpg
# 输出:broken.jpg: PNG image data ...
发现它其实是 PNG!
hexedit 或 010 Editor 修复文件头
常见文件头(Hex):
| 格式 | 文件头(前几个字节) |
|---|---|
| JPG | FF D8 FF |
| PNG | 89 50 4E 47 0D 0A 1A 0A |
| GIF | 47 49 46 38 |
| ZIP | 50 4B 03 04 |
示例修复步骤:
- 用
xxd broken.jpg | head -n 1查看开头 - 发现不是
FF D8 FF→ 不是JPG - 改名为
broken.png - 或用
010 Editor手动写入正确的PNG头
PNG修改宽高
PNG(Portable Network Graphics)是一种无损压缩图像格式,具有严格的二进制结构。
出题人会故意修改 IHDR 块中的 图像宽度或高度,导致解析器认为尺寸异常而拒绝显示图片。
但由于只是改了数值,原始像素数据仍然完整,因此可以通过暴力尝试正确的宽高值并配合CRC校验验证来恢复原图。
实战演练:一步一步解一道隐写题
题目描述:
下载一张图片 secret.jpg,说是“flag就在这张图里”。
步骤1:查看基本信息
file secret.jpg
# 输出:JPEG image data, JFIF standard 1.01
步骤2:提取字符串
strings secret.jpg | grep flag
# 无结果
步骤3:检查是否有附加文件
binwalk secret.jpg
输出:
0x0 JPEG image header
0x1A0F0 Zip archive data
发现ZIP!开始提取。
步骤4:提取隐藏ZIP
binwalk -e secret.jpg
进入 _secret.jpg.extracted/,发现 flag.txt
但打不开?提示需要密码。
步骤5:尝试Steghide
steghide extract -sf secret.jpg
输入空密码 → 成功提取 message.txt,内容是:
The password is ctf2025
步骤6:解压ZIP
unzip hidden.zip
# 输入密码:ctf2025
得到 flag.txt,内容为:
flag{steganography_is_fun}
Flag到手!
新手工具清单(必备收藏)
| 工具 | 安装方式 | 用途 |
|---|---|---|
binwalk |
sudo apt install binwalk |
分析文件结构 |
steghide |
sudo apt install steghide |
提取steghide隐写 |
stegcracker |
GitHub下载 | 自动爆破steghide密码 |
zsteg |
gem install zsteg |
分析PNG/LSB隐写 |
exiftool |
sudo apt install exiftool |
查看元数据 |
010 Editor |
官网下载 | 十六进制编辑 |
CyberChef |
在线使用 | 编码解码辅助 |
解题流程图(新手照着做就行)
开始
↓
拿到图片 → 使用 file 查看真实类型
↓
使用 strings 查找明文flag
↓
使用 binwalk 分析是否拼接文件
↓ 是
发现ZIP等 → 使用 binwalk -e 或 dd 提取
↓
检查是否加密 → 尝试解压
↓ 否
使用 steghide 提取(可尝试空密码)
↓
使用 exiftool 查看元数据
↓
使用 zsteg / Stegsolve 分析LSB
↓
综合线索 → 得到flag!
---
## 写在最后
图片隐写是CTF MISC中最有趣也最直观的部分。它不像Pwn那样复杂,也不像逆向那样烧脑,只需要你细心观察、善用工具,就能一步步揭开谜底。
> 记住:**每一张图片都可能是“陷阱”,也可能是宝藏。**
作为新手,不要怕失败。多做题、多看Writeup、多总结套路,很快你也能一眼识破“藏flag的猫”。
Happy Hacking!
---
祝你在CTF中旗开得胜,早日成为“看图识flag”的高手!🚩

浙公网安备 33010602011771号