ZIP
对于一个 .zip
文件来说,它由3部分组成,而每部分都有对应的文件头标记
-
压缩源文件数据区(简称数据区),文件头为
50 4B 03 04
-
压缩源文件目录区(简称目录区),文件头为
50 4B 01 02
-
压缩源文件目录结束标志(简称目录结束标志),文件头为
50 4B 05 06
其中,所有文件头都有 50 4B
,其对应的ASCII码为 PK
,纪念 .zip
的发明人Phil Katz先生
数据区
-
红色方框的
50 4b 03 04
代表数据区的文件头标识 -
14 00
表示pkware的最低版本、00 00
表示通用位标识、08 00
表示压缩方式、72 bd
和4d 50
分别表示最后的修改时间和修改日期 -
03 c3 94 58
是CRC-32校验码 -
两个绿色方块分别表示压缩后、压缩前的文件体积大小
0c 00 00 00
和0a 00 00 00
-
05 00
表示文件名长度、00 00
表示扩展区长度很显然,
.zip
对它们的存储也是通过小端序 -
蓝色方框表示文件名,它占用的字节数由前面的
05 00
决定,31 2e 74 78 74
对应的ASCII码就是1.txt
目录区
-
目录区文件头标识是
50 4B 01 02
-
00 00
表示通用位标记,08 00
表示压缩方法,72 bd 4d 50
分别表示最后修改时间和日期,03 c3 94 58
表示源数据的CRC-32校验码,0c 00 00 00
和0a 00 00 00
分别表示压缩后文件大小、压缩前文件大小,05 00
表示文件名长度,24 00
表示扩展区长度
目录结束标志
-
目录结束标志文件头标识是
50 4B 05 06
ZIP伪加密
全局方式位标记的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性!
第二个数字为奇数时 –>加密
第二个数字为偶数时 –>未加密
方法
-
winhex修改全局方式位标记中的09改为00
-
ZipCenOp工具
放在同一文件夹下,运行进行解密
java -jar ZipCenOp.jar r xxx.zip
同理运行进行伪加密
java -jar ZipCenOp.jar e xxx.zip
CRC碰撞
在CTF,可能给你一个加密了的
.zip
文件,并且密码很长,不太可能通过暴力破解得到密码;但是里面只包含一个小小的.txt
文件,记录着长度不到30的flag
我们留意到CRC-32校验码只对源数据进行运算,如果我们无法爆破 .zip
的密码,那么不妨直接爆破里面的flag.
提示我们flag为6位数,并且根据原始大小 6
猜测文件 flag6位数
中只包含为flag的那6位数;又知道了这6位数的CRC-32校验码,写脚本对这6位数进行爆破:
# Python 2 import zlib for i in range(100000, 1000000): if hex(zlib.crc32(str(i)) & 0xffffffff)[2:-1] == "9c4d9a5d": print i
最后得到的输出结果 954288
就是flag了