面向解题,像素点和数据块等细节未来再总结。o( ̄▽ ̄)ブ
感谢大佬完整文件结构的分享:
https://www.cnblogs.com/lidabo/p/3701197.html
https://blog.csdn.net/qq_26187985/article/details/83654197
PNG文件
-
关键点:PNG,IHDR是文件头标志,IEND是文件结束的标志。【牢记】
-
详细介绍:
1.PNG文件标志----> |PNG数据块…|PNG数据块|
2.PNG文件头(二进制):89 50 4E 47 0D 0A 1A 0A
3.IHDR:第一块数据头
4.宽高:(第一个数据包)0x10—0x17位,宽高分别占四个字节。【常见】
- 完整的结构(感谢大佬):
00000000~00000007:
可以看到,选中的头8个字节即为PNG文件的标识。
接下来的地方就是IHDR数据块了:
——————————————————
00000008~00000020:
00 00 00 0D 说明IHDR头块长为13
49 48 44 52 IHDR标识
00 00 00 08 图像的宽,8像素
00 00 00 08 图像的高,8像素
04 色深,2^4=16,即这是一个16色的图像(也有可能颜色数不超过16,当然,如果颜色数不超过8,用03表示更合适)
03 颜色类型,索引图像
00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
00 同上
00 非隔行扫描
36 21 A3 B8 CRC校验
————————————————
00000021~0000002F:
可选数据块sBIT,颜色采样率,RGB都是256(2^8=256)
————————————————
00000030~00000062:
这里是调色板信息
00 00 00 27 说明调色板数据长为39字节,既13个颜色数
50 4C 54 45 PLTE标识
FF FF 00 颜色0
FF ED 00 颜色1
…… ……
09 00 B2 最后一个颜色,12
5F F5 BB DD CRC校验
——————————————————
00000063~000000C5:
这部分包含了pHYs、tExt两种类型的数据块共3块,由于并不太重要,因此也不再详细描述了。
——————————————————
000000C0~000000F8:
以上选中部分是IDAT数据块
00 00 00 27 数据长为39字节
49 44 41 54 IDAT标识
78 9C…… 压缩的数据,LZ77派生压缩方法
DA 12 06 A5 CRC校验
——————————————————
000000F9~00000104:
IEND数据块,这部分正如上所说,通常都应该是
00 00 00 00 49 45 4E 44 AE 42 60 82
- 特殊
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。
PNG中规定除关键数据块外,其它的辅助数据块都为可选部分,因此,有了这个标准后,我们可以通过删除所有的辅助数据块来减少PNG文件的大小,文件大小减少后,并不影响图像的内容。
PNG格式可以保存图像中的层、文字等信息,一旦删除了这些辅助数据块后,图像将失去原来的可编辑性。
JPG文件
- 关键点:
JPG的文件头为 FF D8 FF
- 结构
目前遇见的考察JPG文件结构的题目较少,这里只附上大佬链接
https://www.cnblogs.com/reddusty/p/4850403.html
JPG文件还分很多种类型。
ZIP文件
- 关键点:
- 文件头(二进制):50 4B 03 04 (文字为PK开头)【牢记】
- 伪加密:
(1)源文件数据区:50 4B 03 04 xx xx(压缩使用的pkware的版本) xx xx(全局方式位标记,平常为00 00),
(2)源文件目录区:50 4B 01 02 xx xx(压缩使用的pkware的版本) xx xx(全局方式位标记,伪加密的关键位置,平常为00 00,09 00时伪加密,第二位为奇数就行)- 那么,如何辨别当前的zip是真的加密还是伪加密?(看第二位的奇偶)
(1)无加密
压缩源文件数据区的全局加密应当为00 00 (504B0304两个bytes之后)
且压缩源文件目录区的全局方式位标记应当为00 00(504B0304四个bytes之后)
(2)假加密
压缩源文件数据区的全局加密应当为00 00
且压缩源文件目录区的全局方式位标记应当为09 00
(3)真加密
压缩源文件数据区的全局加密应当为09 00
且压缩源文件目录区的全局方式位标记应当为09 00
- 完整的结构(感谢大佬):
压缩源文件数据区:
50 4B 03 04:这是头文件标记(0x04034b50)
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密) 头文件标记后2bytes
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
00 00:扩展记录长度
6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500
压缩源文件目录区:50 4B 01 02:目录中文件文件头标记(0x02014b50)
3F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,伪加密的关键) 目录文件标记后4bytes
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 00 00 00:外部文件属性00 00 00 00:局部头部偏移量
6B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001
压缩源文件目录结束标志:
50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
59 00 00 00:目录区尺寸大小3E 00 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度
RAR文件
- 关键点:
Rar压缩包的文件头为
0x 52 61 72 21 1A 07 00
- 结构
目前遇见的考察RAR文件结构的题目较少,这里只附上WIKI链接
https://wiki.x10sec.org/misc/archive/rar/#_1
https://blog.csdn.net/Claming_D/article/details/105899397
RAR 文件主要由标记块,压缩文件头块,文件头块,结尾块组成。
HEAD_FLAGS 中0x04 - file encrypted with password
为加密标志。【此位若被置1,则文件使用了基于密钥的加密】
解题技巧的总结
1.二进制嵌入文件:对于一般的题,修改文件内部数据块难度较大(最低有效位隐写等问题此篇暂不整理),所有常将其他类型文件藏在末尾,留心观察有可能加快解题速度。(同见下图)
一个完整的 JPG 文件由 FF D8 开头,FF D9结尾。
一个完整的PNG 文件由 89 50 4E 47 开头,AE 42 60 82结尾。
做题时注意观察在图片中可能藏有的ZIP压缩包(通过RAR,PK等标记)
例子:BUUCTF 小明的保险箱
idea:可以用写一个脚本,写一个字典,用模块扫描二进制文件中的文件格式,以减少多次尝试的工作量。
P.S:当然,直接使用Binwalk也是可以的。
2.伪加密:ZIP压缩文件观察文件头,源文件目录区,源文件数据区后面的四个16进制的奇偶,对比两部分的全局方式位标记是否一致,来判断是否为伪加密,不要盲目的爆破。除非它明示你,但这种难度的题比赛应该不会见到。
P.S.未加密的压缩包
binwalk -e
可无视密码直接解压3.语境:大部分题目要结合题目的语境,有时有时候你以为它是让你爆破,其实…,题里都暗示你了啊,可能就会掺杂密码学等问题。
4.爆破/字典/掩码攻击
掩码攻击:如果已知密码的某位,如第3位是X,那么可以构造 ??X??? ,进行爆破。
5.修改文件格式或后缀名,得到正确格式文件
查找文件中的标志性byte,必要时补充上文件格式通用的开头结尾标记,就能打开了。
6.CRC32爆破【CRC(循环冗余校验)是一个文件中所有数据参与运算得到的校验码,来校验压缩包的完整性,数据完全相同时,得到的校验码相同】
可以通过CRC产生的原理来反向得到压缩包的内容(适用于压缩包比较小的情况)【原理不懂/(ㄒoㄒ)/~~】
#coding:utf-8 import binascii import string dic=string.printable #各种打印字符 crc = '''你的输入 ''' # 记得要以0x开头 def CrackCrc(crc): for i in dic : for j in dic: for p in dic: for q in dic: s=i+j+p+q if crc == (binascii.crc32(s) & 0xffffffff): print s
功力不足看不懂原理系列: https://blog.csdn.net/weixin_34273481/article/details/86410911
7.明文攻击(用到了CRC的原理)
原理:ZIP明文攻击就是利用已知文件找加密密钥,利用密钥来解锁其它加密文件,因为ZIP压缩包里的所有文件都是使用同一个加密密钥来加密的。
条件:已知一个加密的压缩包,手中有压缩包中的一个完整文件A,将他压缩,如果A压缩后的CRC与原压缩包中的一样。
可以用Advanced Zip Password Recovery来进行破解,选择Plain-text模式。把两个压缩包都放进去就能解出来密码(亲测时间或长或短,有的可以到20分钟)。
文件头查询链接:http://www.garykessler.net/library/file_sigs.html