# zip总结

## 0x00 伪加密

Zip伪加密的出现是因为zip二进制文件中有一位是标记是否加密的。若zip包实际上没有被加密但加密位却是01，那么在打开时就会提示有密码。（Mac OS以及部分Linux可以直接打开）

我们只要用16进制编辑器修改加密标志位为00即可破解。有关Zip文件头协议可以参考附录。

我们还可以利用工具ZipCenOp.jar工具修改，道理是一样的。

## 0x01 爆破密码

爆破主要是利用工具，结合密码所处域的所有可能性字符串进行爆破。有时我们知道密码的一部分，这时就可以缩小密码域的范围，缩小密码的域可以提升爆破速度，这时可以手工生成字典。

Windows下常用的爆破工具有：

1. Ziperello
2. AZPR

生成字典可以手动写脚本，也可以用一些工具，比如kali下的crunch。

## 0x02 明文攻击

明文攻击的条件是你已经知道压缩包中加密文件的一部分文件(大于12bit)，这时就可以进行明文攻击。详细原理不赘述。

在攻击前，拿到了已知文件后可以先用压缩工具对已知文件进行压缩看看CRC32是否和未知加密文件的CRC32一致，若不一致可以考虑换个压缩工具。若一致可进行明文攻击。

攻击也可用AZPR工具进行。

其他工具：\[UZPC]\(<http://www.chat.ru/~m53group>) \[PKCrack]\(<http://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html>)

**注意：当明文的大小比较小时，攻击速度会比较慢；即使有时没有恢复密码，也可以使用明文攻击，最后点保存还是能得到压缩包里内容的(这点很坑。。)。**

## 0x03 CRC32碰撞

当压缩包密码实在解不出来，但是压缩包内的内容比较短的时候可以用CRC32碰撞。

这里记录一个脚本：python2.7

```python
#!/usr/bin/env python

import binascii

dic = r"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-./:;<=>?@[\]^_`{|}~ "

for x1 in dic:
    for x2 in dic:
        for x3 in dic:
            for x4 in dic:
                for x5 in dic:
                    s = x1+x2+x3+x4+x5
                    crc = binascii.crc32(s)&0xFFFFFFFF
                    if (crc==0x20AE9F17):
                        print hex(crc),s
```

## 0x04 压缩包损坏

此类需要了解[Zip文件协议](http://blog.csdn.net/ETF6996/article/details/51946250),结合 Binwalk 扫描损坏的文件包，然后利用16进制工具修复。

附录：Zip文件协议

```bash
压缩源文件数据区 
50 4B 03 04：这是头文件标记（0x04034b50）
14 00：解压文件所需 pkware 版本 
00 00：全局方式位标记（有无加密） 
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：全局方式位标记（有无加密，这个更改这里进行伪加密，改为09 00打开就会提示有密码了） 
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 文件注释长度
```

参考：

<https://bobao.360.cn/ctf/learning/203.html>

<http://www.blogsir.com.cn/safe/252.html>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ctfbook.ph0en1x.com/misc/zipzong-jie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
