zip伪加密知识点
0x01 ZIP文件格式原理
一个 ZIP 文件由三个部分组成:
压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志
1、压缩源文件数据区
在这个数据区中每一个压缩的源文件/目录都是一条记录,记录的格式如下:
[文件头+ 文件数据 + 数据描述符]
a、文件头结构
b、文件数据
源文件内容……
c、数据描述符
组成 长度
CRC-32校验 4 bytes
压缩后尺寸 4 bytes
未压缩尺寸 4 bytes
这个数据描述符只在全局方式位标记的第3位设为1时才存在,紧接在压缩数据的最后一个字节后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。
例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。
2、压缩源文件目录区
在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据
3、压缩源文件目录结束标志
0x02 实例
为了方便理解,上面的知识点。 我创建了很多不同的文件,用于理解zip文件格式的意思。 首先 创建一个1.txt的文件,在里面放入一些字符串。
之后通过16进制编辑器打开,发现有好多好多好多行。(这是一个最简单的txt压缩zip文件的16进制内容)
根据上面的知识点,总共划分为三个部分。 这三个部分分别为
一、压缩源文件数据区(这个区域里又分为三个小点)(由50 4B 03 04作为开始标识) 1.文件头结构部分
2.文件数据部分
3.数据描述符部分
二、压缩源文件目录区(由 50 4B 01 02作为开始标识)
三、压缩源文件目录结束标志(由50 4B 05 06为开始标识)
接下来就是分别看下这三个区域里面的详细内容:
一、压缩源文件数据区:
1.文件头结构:
50 4B 03 04:这是头文件标记(0x04034b50)
0A 03:解压文件所需 pkware 版本
00 00:全局方式位标记(第二个数字为当前zip有无加密的标识)
00 00:压缩方式
91 5D:最后修改文件时间
0D 53:最后修改文件日期
1F 37 C0 65:CRC-32校验
07 00 00 00:压缩后尺寸
07 00 00 00:未压缩尺寸
05 00:文件名长度
注:此处的5代表5位,源文件的文件名为1.txt,总共占5位。
如果源文件的文件名为111111.txt,那么长度就为10位,此处就会变成0A 00。
00 00:扩展记录长度
31 2E 74 78 74:文件名(不定长度)
空:扩展字段(不定长度)
2.文件数据:
注:通常来说,压缩文件原始数据的内容,都是这一部分,所以有时会非常多(例如压缩一张图片)。
61 73 64 61 73 64 0A :文件数据内容(理解为源文件的内容)
3.数据描述符:
在这里暂无——这个数据描述符只在全局方式位标记的第3位设为1时才存在 在这个实例中,全局方式位标记第三位为0
二、压缩源文件目录区:
在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据。
注:为了更加了解区别,此处压缩了2个不一样的源文件作为对比。
一个是压缩txt文件的zip包,一个是压缩jpg文件的压缩包。
目录中文件文件头标记 4 bytes (0x02014b50)
压缩使用的pkware 版本 2 bytes
解压文件所需 pkware 版本 2 bytes
全局方式位标记 2 bytes
压缩方式 2 bytes
最后修改文件时间 2 bytes
最后修改文件日期 2 bytes
CRC-32校验 4 bytes
压缩后尺寸 4 bytes
未压缩尺寸 4 bytes
文件名长度 2 bytes
注:这里的图片压缩包,压缩前源文件的文件名为“未知 2 2.jpg”。
源文件长度为0C 00,也就是长度为12。
其中2个汉字占4位。
空格+2+空格+2占4位。
.jpg占4位。
所以一共为12位。
扩展字段长度 2 bytes
文件注释长度 2 bytes
磁盘开始号 2 bytes
内部文件属性 2 bytes
外部文件属性 4 bytes
局部头部偏移量 4 bytes
文件名 (不定长度)
扩展字段(不定长度)+ 文件注释 (不定长度)
三、压缩源文件目录结束标志
目录结束标记 4 bytes (以50 4B 05 06为标识)
当前磁盘编号 2 bytes
目录区开始磁盘编号 2 bytes
本磁盘上纪录总数 2 bytes
注:如果是压缩了3个文件,那么这里的标识就会变成03 00。
目录区中纪录总数 2 bytes
目录区尺寸大小 4 bytes
目录区对第一张磁盘的偏移量 4 bytes
ZIP 文件注释长度 2 bytes
ZIP 文件注释 (不定长度)(在这里暂无)
0x03 伪加密应用
了解了ZIP的文件格式后,就可以对ZIP的文件进行修改。实现伪加密以及伪加密的破解。
一、伪加密设置
找到全局方式位标记(第二个数字为当前zip有无加密的标识) 一共有两处 一个是在压缩源文件数据区,一个是在压缩源文件目录区
全局方式位标记的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性。
第二个数字为奇数时 –>加密
第二个数字为偶数时 –>未加密
所以在这里,可以使用16进制编辑器,将00 00 修改为单数 01 00。
之后,使用解压软件进行解压,就会发现,需要输入密码了。
二、zip加密方式的判断
同时zip总共存在三种模式,分别为 无加密、伪加密、真加密。 需要知晓判断是真加密还是伪加密的方法。
无加密
压缩源文件数据区的全局方式位标记应当为00 00 且压缩源文件目录区的全局方式位标记应当为00 00
真加密
压缩源文件数据区的全局方式位标记应当为09 00 且压缩源文件目录区的全局方式位标记应当为09 00
三、总结
所以,在遇到CTF压缩包类型的题目时,可以优先使用16进制编辑器打开文件。
找到文件里的两处全局方式位标记,进行判断。
0x04 参考资料
一个zip文件由这样三个部分组成_一只独孤的程序猿-CSDN博客