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打开
image
可以发现这是一个JPG文件,于是我们修改后缀,可以得到一张图片

使用 binwalk 分析文件结构:

binwalk filename.jpg

输出示例:

DECIMAL       HEXADECIMAL     DESCRIPTION
-----------------------------------------
0             0x0             JPEG image data
34782         0x87DE          Zip archive data

发现后面有 ZIP 文件!说明很可能有隐藏内容。
image

🔧 提取方法:

方法一:使用 binwalk -e

binwalk -e filename.jpg

image
这样我们即可拿到图片中隐藏的压缩包

方法二:手动分离

image
这是直接使用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"

如何检测?

先用 filebinwalk 检查是否有异常。

然后尝试提取:

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的动图
image
我们进行抽帧,即可在分离的帧下拼接出flag

StegSolve

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

🔧 推荐工具:

zsteg(专用于PNG/BMP)

zsteg是针对PNG图⽚的专业隐写⼯具,功能强⼤到令⼈惊叹。它能⾃动检测24种不同的隐写⽅法,⽀持从各种位平⾯组合中提取数据

zsteg image.png

自动扫描多种LSB模式,输出隐藏内容。
image
使用zsteg一把梭也可以看到隐藏的png文件

5. 图片修复类题目

有时图片本身无法打开,提示“文件损坏”,其实是故意修改了文件头。

🔍 常见问题:

问题 解决方法
.jpg 实际是 .png 修改扩展名或修复头
文件头被篡改 用十六进制编辑器修复
多张图合并 分离后分别处理

🔧 工具推荐:

file 命令识别真实类型

file broken.jpg
# 输出:broken.jpg: PNG image data ...

发现它其实是 PNG!

hexedit010 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
示例修复步骤:
  1. xxd broken.jpg | head -n 1 查看开头
  2. 发现不是 FF D8 FF → 不是JPG
  3. 改名为 broken.png
  4. 或用 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”的高手!🚩
posted @ 2025-11-08 17:59  慕雪ya  阅读(465)  评论(0)    收藏  举报