免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任
(本文是有关于MISC方向图片隐写部分相关介绍)
一、CTF 图片隐写核心考点
在 CTF 竞赛中,图片隐写题目通常考察选手对文件格式、数据隐藏技术和工具链应用的综合能力,常见以下方向:
-
基础隐写:LSB、EXIF、文件尾部附加数据
-
频域隐写:DCT/DFT 系数修改、盲水印
-
加密隐写:密码保护的压缩包、AES 加密数据
-
组合攻击:元数据线索 + 隐写 + 密码爆破
二:图片格式
1.常见图片格式
2.简单的图片隐写(二维码,条形码,图片拼接等)
条形码
打开可以直接发现为条形马(在线阅读条形码)
3.翻转图片
4.动图分解提取
打开为一动图分解得到以下,然后利用随波逐流加定位点(或自己利用ps添加)(动图分解工具GIF动态图片分解,多帧动态图分解成多张静态图片_图片工具网页版)
(然后提取出二维码由于二维码违规所以未上传)
打开为gif动态图
动态图分解
三:LSB隐写
LSB隐写(使用工具Stegsolve):LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),而人类的眼睛不会注意到这前后的变化,每个像数可以携带3比特的信息。
1.Stegsolve工具介绍:
图像处理主要是analyse这个模块,主要有这四个功能:
File Format: 文件格式,查看图片的具体信息(有时也有可能将flag隐藏其中)
Data Extract: 数据抽取,提取图片中隐藏数据(如以下案例1)
Frame Browser: 帧浏览器,主要是对GIF之类的动图进行分解,动图变成一张张图片(案例2)
Image Combiner: 拼图,图片拼接
2.LSB隐写的图片
1.Preview
我们用StegSolve打开模块,由于是RGB三原色的最低位隐写,所以在Data Extract模,提取Red,Green,和Blue的0通道
信息,在这三个颜色的0通道
上打勾,并按下Preview键,当隐写的内容为文本文件时如下所示:
隐藏信息flag提取成功
2.save bin
如果按下Preview后没有找到有用信息,可以使用save bin保存(如下图)
(然后提取出二维码由于二维码违规所以未上传)
flag就藏于此二维码中
3.Steregram Solve查看图层
使用Steregram Solve查看图层也有可能隐藏信息
四:图片分离
1. binwalk
(自动化分离嵌入文件)
-
检测文件中的隐藏数据:
binwalk image.jpg # 查看文件结构,识别可能的嵌入文件(如ZIP、PNG头等)
-
自动分离所有嵌入文件:
binwalk -e image.jpg # 自动提取到当前目录的 `_image.jpg.extracted` 文件夹
-
支持递归提取(若分离后的文件仍包含隐藏数据)
binwalk -Me image.jpg
-
2. foremost
(基于文件头的分离工具)
-
从图片中恢复已知文件类型:
foremost -i image.jpg -o output_dir # 提取结果保存到 `output_dir`(如果不设-o默认保存至ouput)
-
指定文件类型(如仅提取ZIP):
foremost -t zip -i image.jpg -o output_dir
-
3. strings
+ grep
(查找嵌入的明文信息)
-
直接搜索图片中的字符串(如Flag、密码提示):
strings image.jpg | grep -i "flag{" # 搜索包含 "flag{" 的字符串
strings image.jpg | grep "PK" # 搜索ZIP文件头(PK)
4. exiftool
(检查元数据中的线索)
-
查看EXIF信息(可能隐藏提示或密码):
exiftool image.jpg
5. zsteg
(专用于PNG/BMP的LSB隐写分析)
-
检测PNG中的隐藏数据(如LSB隐写、文件附加):
zsteg -a image.png # 全模式检测
zsteg -E "b1,rgb,lsb" image.png > hidden.txt # 提取特定通道的隐藏数据
6. steghide
(针对JPG的加密隐写提取)
-
提取使用
steghide
隐藏的文件(需密码):steghide extract -sf image.jpg # 交互式输入密码
steghide extract -sf image.jpg -p "pass123" # 直接指定密码
7.操作流程总结
-
初步检测:
binwalk image.jpg # 查看结构
exiftool image.jpg # 检查元数据
strings image.jpg | grep "CTF" # 搜索关键字
-
自动分离:
binwalk -e image.jpg # 尝试自动提取
foremost -i image.jpg -o output # 备用方案
-
手动提取(如果自动失败):
-
用
hexeditor
或xxd
查看十六进制,找到文件头(如PK
表示ZIP)。 -
使用
dd
按偏移量截取数据。
-
8.案例:使用foremost文件分离提取
t
打开为音频,不能播放尝试分离
五:EXIF隐写
EXIF(Exchangeable Image File Format)**是嵌入在图片中的元数据,记录拍摄时间、设备型号、GPS坐标等信息。所以flag就有可能隐藏与其中
当我们打开一张藏有flag的图片时查看其属性得到以下结果可以看到EXIF所示信息基本被隐藏,所以我们该如何将隐藏的信息提取出来呢,这时候就用用到我们的工具exiftool(-k)
将图片拖入工具中得到隐藏的信息红圈所示即为base64编码
我们利用deepseek工具让他帮我们解开这个加密信息
deepseek帮我们解出来了,所以当我们为了找各种解密工具而烦恼时这时候可以直接发给AI助手,这样就可以节省大部分时间
六:图种隐藏
图种隐藏的原理
-
文件结构拼接:将图片文件和其他文件(如ZIP、RAR)直接拼接在一起。
-
利用文件格式特性:图片格式(如PNG、JPG)通常允许在文件尾部附加额外数据而不影响图片显示。
-
隐写工具:使用工具(如
steghide
、binwalk
)将数据嵌入图片的像素或元数据中。
所以我们得知原理后就轻而易举的知道只要在kali中使用foremost分离就可以得到flag
SilentEye图片隐写工具
SilentEye 是一款开源的图片隐写工具,支持将文本或文件隐藏到图片中,同时提供加密功能以增强安全性。它支持多种图片格式(如BMP、PNG、JPG)和隐写算法(如LSB、DCT)
可以看到图片上有许多小点
打开工具
我们先将这张照片加密看看有什么变化
狗子照片出现了许多点,所以我们可以知道这个工具加密信息后会出现点
所以我们解密那张眼镜照片成功得到flag
七:盲水印隐写
盲水印(Blind Watermarking)是一种在图片中嵌入不可见水印的技术,即使图片被裁剪、压缩或旋转,水印仍然可以提取
1.盲水印的原理
-
频域变换:将图片从空域(像素)转换到频域(如傅里叶变换、离散余弦变换)。
-
水印嵌入:在频域中修改特定系数,嵌入水印信息。
-
水印提取:通过逆变换从频域中提取水印。
2. 盲水印的特点
-
不可见性:水印对肉眼不可见,不影响图片视觉效果。
-
鲁棒性:即使图片被裁剪、压缩或旋转,水印仍可提取。
-
算法多样性:常见的盲水印算法包括傅里叶变换、离散余弦变换(DCT)、小波变换等。
想具体了解参考大佬文章:如何给图片加盲水印?盲水印和图片隐写术实现及原理 - 知乎隐写术(盲水印):从入门到出门_隐写水印-优快云博客
3.打开工具WaterMark
我们先实验添加水印
然后我们提取水印成功
4.利用python提取盲水印
import cv2
import numpy as np
import matplotlib.pyplot as plt
def extract_blind_watermark(image_path, output_path, watermark_size=(100, 100)):
"""
从图片中提取盲水印
:param image_path: 输入图片路径
:param output_path: 提取的水印保存路径
:param watermark_size: 水印的大小 (height, width)
"""
# 读取图片并转换为灰度图
img = cv2.imread(image_path, 0)
if img is None:
print("错误:无法读取图片,请检查路径和文件格式。")
return
rows, cols = img.shape
# 傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 提取水印区域(假设水印嵌入在频域中心)
center_row, center_col = rows // 2, cols // 2
watermark_region = dft_shift[
center_row - watermark_size[0] // 2: center_row + watermark_size[0] // 2,
center_col - watermark_size[1] // 2: center_col + watermark_size[1] // 2,
0 # 实部
]
# 对水印区域进行归一化和增强
watermark = (watermark_region - np.min(watermark_region)) / (
np.max(watermark_region) - np.min(watermark_region)) * 255
watermark = np.uint8(watermark)
# 保存提取的水印
cv2.imwrite(output_path, watermark)
print(f"盲水印已提取,保存为 {output_path}")
# 显示提取的水印
plt.imshow(watermark, cmap='gray')
plt.title("Extracted Watermark")
plt.axis('off')
plt.show()
# 使用方法
image_path = r"C:\Users\86131\Desktop\盲水印.BMP" # 输入图片路径
output_path = r"D:\phpstudy_pro\WWW\xss\extracted_watermark.png" # 输出水印路径
extract_blind_watermark(image_path, output_path)
遇以上错误为未安装依赖库导致
pip3 install matplotlib 安装
matplotlib
可以参考:
python脚本实现盲水印提取和添加_typeerror: random.shuffle() got an unexpected keyw-优快云博客
用什么生成的水印就应该用什么提取水印否则成功率太低
八:图片ocr爆破
1.利用ctf随波逐流工具一键爆出
2.方法二python+010
就是利用pathon代码或前文使用工具Stegsolve的检查宽高然后使用010修改宽高
python代码
import os
import binascii
import struct
crcbp = open(“E:\CTF/2.png”, “rb”).read() #打开图片
for i in range(2000):
for j in range(2000):
data = crcbp[12:16] +
struct.pack(‘>i’, i)+struct.pack(‘>i’, j)+crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if(crc32 == 0x36B4F5FD): #图片当前CRC
print(i, j)
print(‘hex:’, hex(i), hex(j))
使用Stegsolve检查图片信息得到宽高
将03改为04就可以找到flag
九:分离图层加AES解密
打开题目附件为一张动图放置于动图分解中的到以下内容
利用Stegsolve检查图片信息得到ascii信息。
秘钥ISCC解密二次得到flag
十:图片隐写解题思路
1.工具辅助操作
1. 条形码/二维码处理
使用在线工具本文有链接
2. GIF 图片分离
在线网站本文由链接
2.图片属性与结构分析
元数据检查
在
Stegsolve.jar使用相应模块或使用010查看
图层/通道分析
-
工具:
Stegsolve.jar
-
关键操作:
-
分离 RGB 通道观察异常色块
-
检查 Alpha 通道是否隐藏信息
-
叠加图层查找差异(如
Difference
混合模式)
-
3.LSB 隐写处理流程
Stegsolve 基础操作
-
打开图片 →
Analyse
→Data Extract
-
勾选参数:
-
Bit Planes:
Red 0
、Green 0
、Blue 0
(LSB 位) -
勾选
Bit Order: LSB First
-
勾选
Extract By: Row
-
-
观察数据格式:
-
文本:直接查找
flag{}
-
二进制:保存为
.bin
后分析文件头
-
编码转换技巧
-
Base64 识别特征:结尾常含
==
或=
-
HTML 实体编码(如
flag
→ "flag")
4.文件分离
多文件分离
binwalk -e image.jpg # 自动递归提取
foremost -t all -i image.jpg # 按文件头恢复
dd if=image.jpg bs=1 skip=1234 of=hidden.zip # 手动截取
5.文件头识别与 CRC 爆破
1. 常见文件头对照表
文件类型 | 文件头(Hex) | 文件尾(Hex) |
---|---|---|
PNG | 89 50 4E 47 | AE 42 60 82 |
JPEG | FF D8 FF E0 | FF D9 |
ZIP | 50 4B 03 04 | 50 4B 05 06 |
GIF | 47 49 46 38 | 00 3B |
6.题目特征分析技巧
-
题目名称暗示:
-
含
LSB
→ 检查最低有效位 -
含
Morse
→ 提取像素值转换摩斯电码 -
含
CRC
→ 直接使用 CRC 爆破脚本
-
总结
图片隐写工具使用繁杂多且技术不断演进,攻防双方在隐蔽性与检测能力上持续博弈。掌握核心原理与工具链,结合实战经验,方能快速定位隐藏信息。对于开发者,可将其用于版权保护;对于安全人员,则是渗透测试与取证的关键技能。(本文使用工具例题繁杂多,大部分例题为攻防世界,如果想真正学习到本文知识还需到靶场进行练习。)
注意:本文并未完全介绍完图片隐写内容后续还会补充如图片隐写剩余部分+CTF流量分析+压缩包隐写+取证......如果你对CTF--MISC感兴趣请关注
(需要本文资料联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!)