MISC基础篇-图片隐写

前言

本文主要对misc中图片隐写中的常考点以及经典解题思路进行总结。

考点

  • 文件类型判断
  • exif隐写
  • 文件提取
  • 图片宽高
  • JPEG隐写
  • PNG隐写
  • LSB隐写
  • 盲水印
  • GIF隐写

分析

1.文件类型判断

  • 010editor 分析文件头尾(可再另一篇博客查看文件头总结)
  • Linux中使用file xxx命令查看文件类型
  • Windows中使用TrlDNET工具查看文件类型

2.exif隐写

  • 右键属性查看(信息有限)
  • exiftool查看:exiftool xxx(文件名)

3.文件提取

找到隐藏文件

  • 010Editor: 如果熟悉各种文件类型特点,可直接查看字符串来查找隐藏文件。
  • 压缩工具: 直接用如 Bandzip、7Z等打开图片,可直接查看隐藏文件。
  • Binwalk: 使用binwalk xxx直接查看隐藏文件

分离隐藏文件

  • 复制数据: 如果在010Editor或其他地方找到隐藏文件,并确定了头、尾,可以通过保存数据为新文件来分离出隐藏文件。
  • 解压工具: 解压工具能够直接解压缩图片中的隐藏文件。
  • Foremost: 使用foremost xxx来分离隐藏文件,不太推荐使用binwalk -e xxx,本人实际应用中会遇见foremost分离出文件而binwalk分离不出的情况。

4.修改图片宽高

PNG图片

宽:0010h ~ 0013h
高:0014h ~ 0017h
CRC(循环冗余检测):001dh ~ 0020h
可通过爆破CRC来恢复原图片宽高,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#图片CRC校验
import binascii
import struct

crc32_hex = 0x2044BBCE #图片CRC值

filename = 'xxx.png' ##图片路径
crcbp = open(filename, "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 == crc32_hex):
            print(i, j)
            print('wid:', hex(i))
            print('hight:', hex(j))

JPG图片

高:在FF CO/C2数据之后的 第4、第5个字节。
宽:在高之后的两个字节。

如图各个块:
1:起始头
2:数据长度
3:数据精度
4:
5:

BMP图片

宽:0012h ~ 0015h
高:0016h ~ 0019h

JPEG隐写

jsteg、JPHS(JPHide & JPSeek)、outguess 01.3b、steghide 0.4、stegbreak、camouflage、appendx和wbirch。

1.JPHS(JPHide & JPSeek)

工具: jphswin
原理:
将隐藏信息嵌入到图片的DCT系数的LSB中。
操作:
JPHide:用于隐藏信息。
JPSeek:用于提取JPHide隐藏的信息。

PNG隐写

1.字符串

工具: 010editor
思路: 查看图片的固定模块是否正确,如开头,结尾,IDAT,CRC
可能的情况:

  • IDAT改写,导致图片显示不完整
  • 每个CRC中隐藏可打印字符
  • 图片结尾隐藏字符串
  • 隐藏文件(可能经过修改,自动工具无法检测,需手动查看并恢复)

2.zsteg

1
zsteg xxx.png --all

3.APNG动态图

是PNG的动态扩展,结合了PNG和GIF的优势。
工具: apngdis_gui
功能: 将APNG动图分解成多张图片。


MISC基础篇-图片隐写
http://ramoor.github.io/2025/04/10/MISC基础篇-图片隐写/
作者
Ramoor
发布于
2025年4月10日
许可协议