图片像素与LSB
图片像素与LSB
本文适合
已经会用 file、exiftool、binwalk 做基础附件检查的 Misc 学习者。学完你能:判断图片是否可能存在像素/通道/LSB 隐写,用工具和脚本提取 bit,并把提取结果继续归类为文本、二维码、压缩包或二进制文件
图片隐写题常常不是“看图猜字”,而是利用图片文件中像素、颜色通道、透明度或帧之间的细微差异藏信息。理解像素结构,是做图像 Misc 的基础。
一句话判断
图片显示正常但体积、通道、透明度、bit plane、元数据或尾部附加异常时,先把“文件结构检查”和“像素层检查”分开做,再用提取结果反证隐藏方式。
题目中常见信号
说明:可能有 LSB 或尾部附加
第一动作:zsteg、binwalk、看文件尾
说明:可能在通道或 bit plane
第一动作:分离 RGB/Alpha 和低位
说明:信息可能藏在透明通道
第一动作:提取 Alpha 或关闭透明显示
说明:可能靠像素差异藏数据
第一动作:做差分图或 XOR
说明:JPEG 有损,不适合普通像素 LSB
第一动作:查 EXIF、缩略图、DCT、尾部附加
说明:还不是结果
第一动作:按字节、二维码、文件头继续判断
核心概念
LSB 隐写利用的是颜色通道最低位改变不明显。关键不只是“取最低位”,而是要确认:
- 使用哪个通道:R、G、B、A 或调色板索引。
- 使用哪一位:bit0、bit1,甚至多个低位。
- 扫描顺序:行优先、列优先、反向、蛇形或伪随机。
- 输出解释:ASCII、二维码、压缩包、图片、加密数据都可能是中间结果。
PNG/BMP 通常适合像素 LSB,JPEG 更常见的是元数据、缩略图、DCT 系数或尾部附加。
最小分析流程
- 先回到 文件头、文件尾与真实类型,确认图片真实格式和是否有尾部附加。
- 用
exiftool查看元数据、注释、GPS、缩略图。 - 对 PNG/BMP 跑
zsteg,快速枚举常见通道和位序。 - 手动查看 RGB/Alpha 通道和 bit plane,确认工具输出是否可信。
- 提取 bit 后按 8 bit 分组,检查 ASCII、二维码、压缩包文件头。
- 如果结果仍是二进制,继续转 压缩包与嵌套文件 或 编码、哈希与加密。
最小验证示例
file secret.png
exiftool secret.png
binwalk secret.png
zsteg -a secret.png用 Python 提取 RGB 的最低位:
from PIL import Image
img = Image.open("secret.png").convert("RGB")
bits = []
for r, g, b in img.getdata():
bits.extend([r & 1, g & 1, b & 1])
data = bytearray()
for i in range(0, len(bits) - 7, 8):
byte = 0
for bit in bits[i:i+8]:
byte = (byte << 1) | bit
data.append(byte)
print(data[:100])
open("lsb.bin", "wb").write(data)判断依据:
zsteg 有稳定输出 -> 优先验证对应通道和 bit
lsb.bin 开头是 PK/PNG/GIF/PDF -> 转文件类型或压缩包分析
lsb.bin 是可打印文本 -> 继续看是否编码、flag 或提示常见利用 / 解题路线
路线总览:
关键证据:zsteg 输出可读字符串
常用动作:记录通道、位序、输出
关键证据:提取结果有文件头
常用动作:保存为 .bin 后 file / binwalk
关键证据:某个位平面显现二维码/文字
常用动作:导出位平面图,放大或反色
关键证据:透明区域或 palette 异常
常用动作:提取 A 通道或调色板索引
关键证据:两图像素差异有结构
常用动作:ImageChops difference / XOR
关键证据:普通 LSB 无结果
常用动作:查 EXIF、缩略图、DCT、尾部数据
常见失败原因
常见原因:格式不是 PNG/BMP,或位序不常见
排查动作:先确认格式,再手写提取
常见原因:bit 顺序、通道顺序或 endian 错
排查动作:尝试 RGB/BGR、MSB/LSB、反向扫描
常见原因:对比度低、需要反色或放大
排查动作:导出 bit plane 后二值化
常见原因:前面有填充或需要跳过长度头
排查动作:搜文件头 magic,按偏移裁剪
常见原因:用错了像素 LSB 思路
排查动作:查 EXIF、尾部、缩略图和 DCT
常见原因:这是下一层线索
排查动作:按提示转压缩包、编码或 OSINT
迷你案例
题目给 normal.png,图片肉眼正常但体积比同尺寸 PNG 大很多。先跑:
zsteg normal.png输出:
b1,rgb,lsb,xy .. text: "PK\x03\x04..."说明 RGB 每通道 bit0 按 xy 顺序拼出 ZIP 文件头。用脚本保存为 lsb.bin 后:
file lsb.bin
7z x lsb.bin得到 flag.txt。WP 里要写清“体积异常 -> zsteg 指出通道 -> 提取结果是 ZIP -> 解压得到 flag”,这条链才算完整。