图片篇
【CTF/MISC】图片隐写题(binwalk/foremost/010editer配合使用)_binwalk和foremost区别-CSDN博客
解题思路
先用binwalk和010看一下有没有隐藏文件
分离文件
用binwalk分离文件,使用dd命令分离出隐藏文件:

从分析的结果看,这个jpg文件隐藏着一个zip文件,从48221块偏移开始就是zip文件。
dd if=1.jpg of=1.zip skip=48221 bs=1
解释:if 指定输入文件,of 指定输出文件,skip 指定从输入文件开头跳过48221个块后开始复制,bs设
置每次读写块的大小为1字节
用foremost分离文件
foremost 1.jpg
执行命令后,foremost会生成output目录存放分离出的文件。
hex编辑器分离文件
hex编辑器有很多,win下有用得较多的winhex、UltraEdit等,linux下有hexeditor等。这里我们以winhex为例来手动分离。
一个完整的 jpg 文件由 FF D8 开头,FF D9结尾,图片查看器会忽略 FF D9 以后的内容,因此可以在 jpg 文件中加入其他文件。
经过上面的分析, 知道图片中隐藏了zip文件,zip文件的开头16进制为504B0304,先搜索16进制文本 FFD9,然后后面跟着504B0304,于是就可以从 50 开始,复制到最后(因为这里只有一个zip,所以复制到最后),另存为新文件,就得到了隐藏的压缩包。



改后缀名
分析知道隐藏文件是zip后,有一个简单粗暴的方法是直接把图片的后缀改为.zip,然后解压即可(这种方法虽然简单快速,但如果隐写了多个文件时可能会失败)。
PNG文件格式详解
概述
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG’s Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。(说白了这就是一种方便的、适于网络传播的轻便图片文件格式)
特性
- 使用调色板技术可支持256种颜色的彩色图像。(必须的)
- 流式读/写性(streamability):图像文件格式允许连续读出和写入图像数据。(因此适于网络传播)
- 逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。(类似马赛克逐渐消除的过程)
- 透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
- 辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。(就是可以说一些废话)
- 独立于计算机软硬件环境。
- 使用无损压缩。(无损!)
- 可在一个文件中存储多幅图像。
文件结构
PNG图像格式文件由文件署名和数据块(chunk)组成。
文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
| 十进制数 | 十六进制数 |
|---|---|
| 137 | 89 |
| 80 | 50 |
| 78 | 4e |
| 71 | 47 |
| 13 | 0d |
| 10 | 0a |
| 26 | 1a |
| 10 | 0a |
这个文件署名就是在《利用文件头标志判断文件类型》中提到的文件头标志了,很简单。
数据块
这里有两种类型的数据块,一种是称为关键数据块(critical chunk),就是必须要有的块;另一种叫做辅助数据块(ancillary chunks)。
每个数据块都由下表所示的的4个域组成。
| 名称 | 字节数 | 说明 |
|---|---|---|
| Length(长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231−1)(231−1)字节 |
| Chunk Type Code(数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
| Chunk Data(数据块实际内容 | 可变长度 | 存储按照Chunk Type Code指定的数据 |
| CRC(循环冗余检测 | 4字节 | 存储用来检测是否有错误的循环冗余码 |
其中CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的,可以看做一种校验码。
关键数据块
关键数据块中的4个标准数据块是:
(1) 文件头数据块IHDR(header chunk):
它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由13字节,组成结构如下:
| 域的名称 | 字节数 | 说明 |
|---|---|---|
| Width | 4 bytes | 图像宽度,以像素为单位 |
| Height | 4 bytes | 图像高度,以像素为单位 |
| Bit depth | 1 byte | 图像深度:索引彩色图像:1,2,4或8 ;灰度图像:1,2,4,8或16 ;真彩色图像:8或16 |
| ColorType | 1 byte | 颜色类型:0:灰度图像, 1,2,4,8或16;2:真彩色图像,8或16;3:索引彩色图像,1,2,4或84:带α通道数据的灰度图像,8或16;6:带α通道数据的真彩色图像,8或16 |
| Compression method | 1 byte | 压缩方法(LZ77派生算法) |
| Filter method | 1 byte | 滤波器方法 |
| Interlace method | 1 byte | 隔行扫描方法:0:非隔行扫描;1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
(2) 调色板数据块PLTE(palette chunk):
它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。结构如下:
|颜色|字节|意义|
|Red|1 byte||0 = 黑色, 255 = 红|
|Green|1 byte||0 = 黑色, 255 = 绿色|
|Blue|1 byte||0 = 黑色, 255 = 蓝色|
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成,因此调色板数据块所包含的最大字节数为768,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
(3) 图像数据块IDAT(image data chunk):
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
(4) 图像结束数据IEND(image trailer chunk):
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
00 00 00 00 49 45 4E 44 AE 42 60 82
不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
最后,除了表示数据块开始的IHDR必须放在最前面, 表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。
辅助数据块
(比较杂,不需要全部了解透)
PNG文件格式规范制定的10个辅助数据块是:
- 背景颜色数据块bKGD(background color)。
- 基色和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。
- 图像γ数据块gAMA(image gamma)。
- 图像直方图数据块hIST(image histogram)。
- 物理像素尺寸数据块pHYs(physical pixel dimensions)。
- 样本有效位数据块sBIT(significant bits)。
- 文本信息数据块tEXt(textual data)。
- 图像最后修改时间数据块tIME (image last-modification time)。
- 图像透明数据块tRNS (transparency)。
- 压缩文本数据块zTXt (compressed textual data)。
数据块摘要
关键数据块、辅助数据块和专用公共数据块(special-purpose public chunks)综合下表中:
| 数据块符号 | 数据块名称 | 多数据块 | 可选否 | 位置限制 |
|---|---|---|---|---|
| IHDR | 文件头数据块 | 否 | 否 | 第一块 |
| cHRM | 基色和白色点数据块 | 否 | 是 | 在PLTE和IDAT之前 |
| gAMA | 图像γ数据块 | 否 | 是 | 在PLTE和IDAT之前 |
| sBIT | 样本有效位数据块 | 否 | 是 | 在PLTE和IDAT之前 |
| PLTE | 调色板数据块 | 否 | 是 | 在IDAT之前 |
| bKGD | 背景颜色数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
| hIST | 图像直方图数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
| tRNS | 图像透明数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
| oFFs | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
| pHYs | 物理像素尺寸数据块 | 否 | 是 | 在IDAT之前 |
| sCAL | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
| IDAT | 图像数据块 | 是 | 否 | 与其他IDAT连续 |
| tIME | 图像最后修改时间数据块 | 否 | 是 | 无限制 |
| tEXt | 文本信息数据块 | 是 | 是 | 无限制 |
| zTXt | 压缩文本数据块 | 是 | 是 | 无限制 |
| fRAc | (专用公共数据块) | 是 | 是 | 无限制 |
| gIFg | (专用公共数据块) | 是 | 是 | 无限制 |
| gIFt | (专用公共数据块) | 是 | 是 | 无限制 |
| gIFx | (专用公共数据块) | 是 | 是 | 无限制 |
| IEND | 图像结束数据 | 否 | 否 | 最后一个数据块 |
tEXt和zTXt数据块中的标准关键字:
| 关键字 | 说明 |
|---|---|
| Title | 图像名称或者标题 |
| Author | 图像作者名 |
| Description | 图像说明 |
| Copyright | 版权声明 |
| CreationTime | 原图创作时间 |
| Software | 创作图像使用的软件 |
| Disclaimer | 弃权 |
| Warning | 图像内容警告 |
| Source | 创作图像使用的设备 |
| Comment | 各种注释 |
一个例子
为了便于研究,我在本地找了个24x24像素的图片:
用十六进制打开后是这样的:
| plain 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | plain 0000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 0000010: 0000 0018 0000 0018 0806 0000 00e0 773d ..............w= 0000020: f800 0000 1974 4558 7453 6f66 7477 6172 .....tEXtSoftwar 0000030: 6500 4164 6f62 6520 496d 6167 6552 6561 e.Adobe ImageRea 0000040: 6479 71c9 653c 0000 0344 4944 4154 78da dyq.e<...DIDATx. 0000050: b454 4b48 5b51 10bd 792f 2646 a346 7411 .TKH[Q..y/&F.Ft. 0000060: 450b cac3 6840 8c14 0242 8542 e9aa ab42 E...h@...B.B...B 0000070: 5785 8614 c428 b4d0 5569 b108 5dbb 29b4 W....(..Ui..].). 0000080: 1b05 a5ab 6cb3 2a14 0ab5 8b42 75a3 d188 ....l.*....Bu... 0000090: 82c6 0ff1 4320 a2e2 2f7e 12ed 9c47 e671 ....C ../~...G.q 00000a0: 8d2f 8950 3a30 dcc7 bb33 67e6 cee7 5826 ./.P:0...3g...X& 00000b0: 2626 8499 288a a2ab d56a d555 55d5 57d7 &&..(....j.UU.W. 00000c0: d7d7 be6c 36fb fef2 f232 45a7 b8ba ba12 ...l6....2E..... 00000d0: c160 5014 13ab d94f 8bc5 72e3 24e0 1e9f .`P....O..r.$... 00000e0: cff7 b9ae ae4e 4c4e 4eda 3299 4c00 777c .....NLNN.2.L.w| 00000f0: 5f4c 1472 16f9 9a07 2e6a 6b6b 875a 5b5b _L.r.....jkk.Z[[ 0000100: 454d 4d8d e8ea ea7a 4eff 3ce2 8ea2 3018 EMM....zN.<...0. 0000110: 94cb c28a 7f04 765f d3b4 27ec d0d8 d8a8 ......v_..'..... 0000120: 5655 55bd 639b 9201 a8b6 a8af 516b 9bcd VUU.c.......Qk.. 0000130: 26ca caca f46f 0020 7bb7 db6d 38d8 ed76 &....o. {..m8..v 0000140: d1d1 d1f1 82ee 34d8 940c 0023 00c2 11e0 ......4....#.... 0000150: 1c20 975d 2781 3d75 381c 379c 9a9b 9b55 . .]'.=u8.7....U 0000160: 2ad7 1012 bb73 0028 c073 1373 8f02 3c68 *....s.(.s.s..<h 0000170: 6b6b fb44 25b9 e554 5e5e 2eba bbbb f18a kk.D%..T^^...... 0000180: c791 4844 2b16 c012 0e87 fd04 faac bebe ..HD+........... 0000190: be85 cad1 e272 b97c 04a0 e245 4ea7 530f .....r.|...EN.S. 00001a0: 5c48 8e8f 8f45 3a9d d6f5 f0f0 7091 747b \H...E:.....p.t{ 00001b0: 7777 779d feff a649 0b07 0281 acb5 baba www....I........ 00001c0: fa97 dfef 7710 7041 309e 2c79 ba20 4800 ....w.pA0.,y. H. 00001d0: 9a13 2f81 7a11 7479 79b9 3f16 8ba1 ae63 ../.z.tyy.?....c 00001e0: caf9 f979 120b 83c5 81e6 03e3 8e4f 59e5 ...y.........OY. 00001f0: a010 5e3c f405 2705 dbd6 7b90 4aa5 1ecd ..^<..'...{.J... 0000200: cdcd 250e 0e0e c4c5 c585 a080 fa49 0686 ..%..........I.. 0000210: 1303 ca81 7007 1bf6 c1f7 d9d9 9958 5b5b ....p........X[[ 0000220: 1384 f73a 140a 7de3 3d58 27e9 8d46 a371 ...:..}.=X'..F.q 0000230: 0491 c14a 89fc 1204 01f8 d4d4 1461 87be ...J.........a.. 0000240: e46f 7262 6363 a377 6666 6671 6f6f cfc8 .orbcc.wfffqoo.. 0000250: dc6c cb65 651b 3439 1e8f 03bc 8fc0 c70a .l.ee.49........ 0000260: 5145 3291 483c 5c58 5888 a251 a5c0 5989 QE2.H<\XX..Q..Y. 0000270: f8c4 d6d6 5676 7a7a fae5 c0c0 c0f8 ad3d ....Vvzz.......= 0000280: c823 ac14 3df3 c3d1 d191 d1e4 620a 5f94 .#..=.......b._. 0000290: 6673 7333 3238 38f8 b520 9be6 3887 ff79 fss3288.. ..8..y 00002a0: 989b f85f 7e3f e4a4 b0f1 74af 1525 3b36 ..._~?....t..%;6 00002b0: 8423 ed45 6745 4585 012c 4f92 3c41 fc02 .#.EgEE..,O.<A.. 00002c0: d008 ed90 7774 74d4 5694 4df9 248e f182 ....wtt.V.M.$... 00002d0: 3278 4ccd 9aca 8161 039f caca 4a80 9b52 2xL....a....J..R 00002e0: b855 1e49 3a55 32f6 c209 60bc 4068 3aa6 .U.I:U2...`.@h:. 00002f0: 8b1a 9aa6 041c 4429 3a6f 7150 3000 9d9d ......D):oqP0... 0000300: 641e 33ed 8114 a485 0238 4178 703c 3939 d.3......8Axp<99 0000310: 11c9 6452 acac acfc 248e 798b 9d21 b0e1 ..dR....$.y..!.. 0000320: f6f6 f6fe a6a6 2683 5ec0 5b94 948f eec3 ......&.^.[..... 0000330: 055f c001 3015 5838 64bc baba 1add d9d9 ._..0.X8d....... 0000340: 01f0 0f76 a0cd 7d33 3f3f 3f42 73ff d1e3 ...v..}3???Bs... 0000350: f104 1b1a 1a54 f890 6805 a748 9a92 3fb4 .....T..h..H..?. 0000360: e6df 691f dcfb fbfb 2366 19e5 64fb f4f4 ..i.....#f..d... 0000370: b46f 7676 7664 6969 6998 5ed1 43fd 1837 .ovvvdiii.^.C..7 0000380: a5eb bb50 c2bf 8822 feb3 fc15 6000 74fe ...P..."....`.t. 0000390: 7622 c159 82da 0000 0000 4945 4e44 ae42 v".Y......IEND.B 00003a0: 6082 0a `.. |
| — | — |
接下来我们试着分析一下:
首先是八个字节的文件头标志,标识着png文件:
plain 1 |
plain 8950 4e47 0d0a 1a0a |
|---|
接下来的地方就是IHDR数据块了:
0000 000d说明IHDR头块长为13
4948 4452IHDR标识(ascii码为IHDR)
下面是IHDR数据块的实际内容
0000 0018图像的宽,24像素
0000 0018图像的高,24像素
08 表示色深,这里是2^8=256,即这是一个256色的图像
06 颜色类型,查表可知这是带α通道数据的真彩色图像
00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
00 同上
00 非隔行扫描
e0 773d f8 CRC校验
以上分析了第一个IHDR块的内容,其他块的分析方法类似,比如接下来的就是tEXt块了,很简单,不做分析了。(当然这里还有重要的IDAT块,这是图像的实际内容)
最后得有个IEND数据块,这部分正如上所说,通常都应该是
00 00 00 00 49 45 4E 44 AE 42 60 82
由于我用的是vim打开,vim在文件最后都会恶心的自己加上0a换行,当然这并没有什么坏的影响。不过这也提醒了我们一个问题,既然在IEND块后面添加任何的字符都对文件的打开造成不了影响,那我们就可以在这里藏一些数据了(当然这种藏法很low)。。。
OK,这就是png文件的基本构造了。
例题:可能会修改文件名

可能是头文件出问题

看上面的8个字节头文件标志
89 50 4E 47 0D 0A 1A 0A
改完就可以打开图片了
文件结构
JPG FFD8FF FFD9
PNG 89 50 4E 47 0D 0A 1A 0A
文件的使用
Qr_research
Stegsolve
Winhex10
各种隐写、爆破脚本
猜测出题人的思路
CTF常见套路
附加字符串
字符串隐藏在图片中
使用strings命令查看
string 1.jpg
kali工具使用
binwalk使用
从表面上来看这只是一个普通的文件,所以我们通过binwalk工具观察这个图片中是否有隐藏文件

通过binwalk观察图片里面是否包含其他文件

通过图片我们可以发现,图片中还隐藏了一个zip文件,因此我们要将zip文件提取出来。
foremost的使用
通过foremost工具将隐藏文件提取出来
Kali Linux提供一款还原专用工具Foremost。该工具通过分析不同类型文件的头、尾和内部数据结构,同镜像文件的数据进行比对,以还原文件。

foremost命令会在当前文件夹下生成一个output文件夹,我们打开output文件夹可以看见有三个文件:

其中的jpg文件夹里面就是我们刚才看到的图片。zip文件夹下存放了一个压缩包,我们点击这个压缩包,发现里面存放了一个flag.txt,我们想要寻找的flag信息应该就存放在这个flag下面。之后我们点击flag.txt,发现需要密码:

这时我们需要通过zip2john工具进行解码
zip2join的使用
通过zip2john工具破解压缩包的密码
刚才我们通过foremost工具将zip文件提取出来之后,解压zip文件的时候,发现文件有密码,首先输入如下命令:
1 | |
zip2john:从 ZIP 文件中提取哈希。./output/zip/00000159.zip:要提取的 ZIP 文件路径。> password.txt:将输出重定向到password.txt文件。
得到password.txt文件,再输入如下命令:
1 | |
我们便可以看到破解出来的密码:

之后我们按照给出的密码解压文件,便可以看到flag信息:

zsteg的使用
一个比StegSolve更方便的工具—zsteg-CSDN博客
根据题目提示,flag在图片数据中,我们用刚下载的zsteg,
用这个命令:(zsteg misc17.png ) ,

然后我们用zsteg提取文件名为flag.txt,
具体命令是:(zsteg -e extradata:0 misc17.png > flag.txt ) ,
我们查看flag.txt,里面什么也没有,

我们再次用binwalk查看这个flag.txt文件用这个命令(binwalk flag.txt),

然后我们再用binwalk去提取也就是这个命令(binwalk -e flag.txt ),
如果命令报错,我们在后面加上这个(–run-as=root)也就是(binwalk -e flag.txt –run-as=root)这个命令。

ctfshow{0fe61fc42e8bbe55b9257d251749ae45}
补充:在那里写extradata:0是因为用zsteg查看misc17的隐藏数据时候发现了这个错误,以后要是还发现类似错误要记得改了这里。
word隐写
文件————选项——————隐藏文字
转换成txt文档也可以看到flag

图片隐写图片 foremost
用winhex打开后搜索文件头
PNG 89504E47 AE426082

发现有两个png开头文件名,判断是图片隐写图片
使用kali中的binwalk工具可以进行查看,再使用foremost工具分离,即可获得flag
foremost命令会在当前文件夹下生成一个output文件夹,我们打开output文件夹可以看见有三个文件

png文件夹里面有两张png,其中就有我们的flag


ctfshow{1df0a9a3f709a2605803664b55783687}
图片删除IDAT(Tweakpng)
【TweakPNG下载】PNG图像浏览(TweakPNG) 1.4.5-ZOL软件下载
图片宽高修改
png 第二行
jpg ffc2后面3组


图片分类
png
crc32爆破


ctfshow misc入门
1、改后缀名
给了一个txt文件

看到开头是89 50 4E 47 0D 0A 1A 01,典型的png开头格式
非预期:看到后面有个ng,盲猜是png哈哈哈

修改后缀名后得到flag

ctfshow{6f66202f21ad22a2a19520cdd3f69e7b}
2、图片附加
放入winhex文本搜索,找一下flag
注意要改成ASCII


3、misc10 binwalk
用winhex打开后搜索文件头
PNG 89504E47 AE426082
没搜到没关系

binwalk -e misc10.png

4、misc11 tweakpng
用winhex打开搜索文件头8950

只有一次说明只有一张照片
用kali的binwalk看一下发现有两个文件,说明有隐藏文件

用 010 editor 打开,运行模板 png.bit ,看到图片有两个 IDAT 块。(前面一题 misc10 也有两个 IDAT 块)

放入tweakpng中删除第一个IDAT
用 tweakpng 打开图片,点击第一个 IDAT 块,右键选择删除。

保存之后,再打开图片就得到 flag 了。

ctfshow{44620176948fa759d3eeafeac99f1ce9}
5、misc14 flag在图片里面
使用命令:binwalk -e misc14.jpg 有信息显示但是没有生成分离文件夹
使用命令:binwalk -e misc14.jpg -D=jpeg –run-as=root 生成分离文件夹,获得flag
-e或--extract:提取文件中的嵌入数据。-D=jpeg:指定提取 JPEG 文件。--run-as=root:以 root 用户身份运行binwalk。
或者010Editor中查看jpeg文件文件头FF D8,文件尾巴FF D9,自己组合复制到新的16进制文件中,保存查看。


ctfshow{ce520f767fc465b0787cdb936363e694}
更新: 2025-07-19 14:01:22
原文: https://www.yuque.com/chaye-apqbl/vsc85q/dxmqut5cbvgy266u
