在设计泛CTF有关压缩包破解的某个题目(主要涉及伪加密和已知明文攻击)过程中,遇到了有关zip格式压缩的一些问题,故写此文章作以总结。 欢迎大家关注交流,转载务必注明出处,谢谢!
根据官方文档上的描述,ZIP文件的格式如下图所示。 通常情况下,我们所用ZIP文件格式为下图中所表示出来的三个部分(其余部分的说明在附录中给出):
yDbks,sXmjz
的plain.txt文件,将其压缩成plain.zip。 下面,分别从压缩源文件数据区、压缩源文件目录区、压缩源文件目录结束标志展开。
1.1 压缩源文件数据区
[Local file header(文件头)+File data(文件数据)+Data descriptor(数据描述符)]
1.1.1 Local file header 文件头
字段含义
文件头主要用于表示此文件的开始,记录了此文件压缩的信息,具体字段的含义如下表。(注:偏移量为十进制)
偏移量 占用字节数 含义 0 4 文件头标识,固定值为0x04034b50 4 2 解压文件所需的pkware最低版本 6 2 Genera purpose bit flag 通用比特标志位 8 2 Compression method 压缩方式 10 2 文件最后修改时间 12 2 文件最后修改日期 14 4 crc32校验码 18 4 压缩后的大小 22 4 未压缩的大小 26 4 文件名长度 28 2 扩展区长度 30 n 文件名 30+n m 扩展区 general purpose bit flag: (2 bytes)
compression method: (2 bytes)
CRC-32: (4 bytes)
实例分析
开始位置 占用字节数 字段说明 00000000 4 文件头标识:0x04034B50 00000004 2 解压文件所需的pkware最低版本:0x0014 00000006 2 通用比特标志位:0x0000 00000008 2 压缩方式:0x0008 0000000A 2 文件最后修改时间:0xBC6F 0000000C 2 文件最后修改日期:0x4D8E 0000000E 4 crc32校验码:0xF4459E5A 00000012 4 压缩后的大小:0x0000000D 00000016 4 未压缩的大小:0x0000000B 0000001A 4 文件名长度:0x00000009 0000001C 2 扩展区长度:0x0000 0000001E 9 文件名:0x7478742E6E69616C70 1.1.2 File data 文件数据
字段含义
开始位置 占用字节数 字段说明 00000027 13 上图红色标记的数据即为压缩后的数据 1.1.3 Data descriptor 数据描述符
字段含义
数据描述符仅在通用Local file header文件头的通用比特标志位的第3比特为1的时候存在。在1.1.1中通用比特标志位的详细说明中可知,如果此位为1,那么Local file header文件头中的CRC32校验码、压缩大小和未压缩大小的字段将设置为0,这三个字段正确的值放在此数据描述符中。
偏移量 占用字节数 字段说明 0 4 CRC32校验码 4 4 压缩后的大小 8 4 未压缩的大小 实例分析
由于我们所选的plain.zip数据包中Local file header文件头中的通用比特标志位第3比特为0,所有不含有此部分,CRC32校验码、压缩大小、未压缩的大小这三个字段的实际值都位于Local file header文件头中。
1.2 压缩源文件目录区
开始位置 占用字节数 字段说明 00000034 4 核心目录文件标志:0x02014B50 00000038 2 压缩所用的PKWare版本:0x001F 0000003A 2 解压最低的PKWare版本:0x0014 0000003C 2 通用比特标志位:0x0000 0000003E 2 压缩方式:0x0008 00000040 2 文件最后修改时间:0xBC6F 00000042 2 文件最后修改日期:0x4D8E 00000044 4 CRC32校验码:0xF4459E5A 00000048 4 压缩后的大小:0x0000000D 0000004C 4 未压缩的大小:0x0000000B 00000050 2 文件名长度:0x0009 00000052 2 扩展域长度:0x0024 00000054 2 文件注释长度:0x0000 00000056 2 文件开始位置的磁盘号:0x0000 00000058 2 内部文件属性:0x0000 0000005A 4 外部文件属性:0x00000020 0000005E 4 本地文件头的相对偏移:0x00000000 00000062 9 目录文件名:0x7478742E6E69616C70 0000006B 0x24 扩展域:从目录文件名结束直至红线末处 1.3 压缩源文件目录结束标志
开始位置 占用字节数 字段说明 0000008F 4 核心目录结束标志:0x06054B50 00000093 2 当前目录结束标记:0x0000 00000095 2 核心目录开始位置的磁盘编号:0x0000 00000097 2 磁盘上所记录的核心目录数量:0x0001 00000099 2 核心目录结构总数:0x0001 0000009B 4 核心目录的大小:0x0000005B 0000009F 4 核心目录开始位置相对于archive开始位置的位移:0x00000034 000000A3 2 注释长度:0x0000
2.1 伪加密
- 利用Linux Kali或Mac操作系统可直接打开,证明是伪加密;
- 利用360压缩等安全工具可直接打开,证明是伪加密;
- 使用WinHex将通用比特标志位改回0,尝试解压缩,如果可以解压则证明是伪加密。
2.2 已知明文攻击
2.2.1 攻击过程
假设不知道某个zip压缩包的密码,但是已经获取或者根据破解得到其中的某一个文件的话,可以考虑采用已知明文攻击。这是因为同个zip压缩包中的所有文件使用同一加密秘钥来进行加密的,所以可以根据已知文件进行同样的压缩以构造部分明文来寻找加密秘钥,利用找到的秘钥解密zip压缩包中其他的文件。 举例:已知下面这个压缩文件(what's this.zip)中plain.txt的内容
- 此时构造已知部分明文失败,检查所用的压缩工具采用的PKWare核心算法,是否和待破解的压缩包what's this.zip所采用版本相同,如下图所示。
根据在第一部分的Zip压缩包结构说明,可知上述采用的PKWare版本为0x001F,故在构造plain.zip时应该注意PKWare版本相同,即可解决该问题。 以上。 本文地址:http://sjzytwl.xhstdz.com/quote/3289.html 物流园资讯网 http://sjzytwl.xhstdz.com/ , 查看更多