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博客

zip伪加密原理及操作_Ju0se-CSDN博客_zip伪加密

zip伪加密原理及操作 - 程序员大本营

编辑于 2021-08-16 15:28