<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=ZIP%E6%A0%BC%E5%BC%8F</id>
	<title>ZIP格式 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=ZIP%E6%A0%BC%E5%BC%8F"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=ZIP%E6%A0%BC%E5%BC%8F&amp;action=history"/>
	<updated>2026-05-05T23:34:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=ZIP%E6%A0%BC%E5%BC%8F&amp;diff=264&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}} &lt;span id=&quot;zip-格式&quot;&gt;&lt;/span&gt; = ZIP 格式 =  == 文件结构 ==  &lt;code&gt;ZIP&lt;/code&gt; 文件主要由三部分构成，分别为  {| class=&quot;wikitable&quot; |- ! 压缩源文件数据区 ! 核心目录 ! 目录结束 |- | local file header + file data + data descriptor | central directory | end of central directory record |}  &lt;ul&gt; &lt;li&gt;&lt;p&gt;压缩源文件数据区中每一个压缩的源文件或目录都是一条记录，其中&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;code&gt;local file…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=ZIP%E6%A0%BC%E5%BC%8F&amp;diff=264&amp;oldid=prev"/>
		<updated>2023-07-03T05:59:29Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}} &amp;lt;span id=&amp;quot;zip-格式&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = ZIP 格式 =  == 文件结构 ==  &amp;lt;code&amp;gt;ZIP&amp;lt;/code&amp;gt; 文件主要由三部分构成，分别为  {| class=&amp;quot;wikitable&amp;quot; |- ! 压缩源文件数据区 ! 核心目录 ! 目录结束 |- | local file header + file data + data descriptor | central directory | end of central directory record |}  &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;p&amp;gt;压缩源文件数据区中每一个压缩的源文件或目录都是一条记录，其中&amp;lt;/p&amp;gt; &amp;lt;ul&amp;gt; &amp;lt;li&amp;gt;&amp;lt;code&amp;gt;local file…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ctf_Wiki}}&lt;br /&gt;
&amp;lt;span id=&amp;quot;zip-格式&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= ZIP 格式 =&lt;br /&gt;
&lt;br /&gt;
== 文件结构 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ZIP&amp;lt;/code&amp;gt; 文件主要由三部分构成，分别为&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 压缩源文件数据区&lt;br /&gt;
! 核心目录&lt;br /&gt;
! 目录结束&lt;br /&gt;
|-&lt;br /&gt;
| local file header + file data + data descriptor&lt;br /&gt;
| central directory&lt;br /&gt;
| end of central directory record&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;压缩源文件数据区中每一个压缩的源文件或目录都是一条记录，其中&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;local file header&amp;lt;/code&amp;gt; ：文件头用于标识该文件的开始，记录了该压缩文件的信息，这里的文件头标识由固定值 &amp;lt;code&amp;gt;50 4B 03 04&amp;lt;/code&amp;gt; 开头，也是 &amp;lt;code&amp;gt;ZIP&amp;lt;/code&amp;gt; 的文件头的重要标志&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;file data&amp;lt;/code&amp;gt; ：文件数据记录了相应压缩文件的数据&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;data descriptor&amp;lt;/code&amp;gt; ：数据描述符用于标识该文件压缩结束，该结构只有在相应的 &amp;lt;code&amp;gt;local file header&amp;lt;/code&amp;gt; 中通用标记字段的第 &amp;lt;code&amp;gt;3 bit&amp;lt;/code&amp;gt; 设为 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; 时才会出现，紧接在压缩文件源数据后&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;Central directory&amp;lt;/code&amp;gt; 核心目录&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;记录了压缩文件的目录信息，在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据。&amp;lt;/p&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Bytes&lt;br /&gt;
! Description&lt;br /&gt;
! 译&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4&lt;br /&gt;
| Central directory file header signature = 0x02014b50&lt;br /&gt;
| 核心目录文件 header标识 =（0x02014b50）&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2&lt;br /&gt;
| Version made by&lt;br /&gt;
| 压缩所用的 pkware 版本&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 2&lt;br /&gt;
| Version needed to extract (minimum)&lt;br /&gt;
| 解压所需 pkware 的最低版本&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 2&lt;br /&gt;
| General purpose bit flag&lt;br /&gt;
| 通用位标记伪加密&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 2&lt;br /&gt;
| Compression method&lt;br /&gt;
| 压缩方法&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 2&lt;br /&gt;
| File last modification time&lt;br /&gt;
| 文件最后修改时间&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 2&lt;br /&gt;
| File last modification date&lt;br /&gt;
| 文件最后修改日期&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 4&lt;br /&gt;
| CRC-32&lt;br /&gt;
| CRC-32 校验码&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 4&lt;br /&gt;
| Compressed size&lt;br /&gt;
| 压缩后的大小&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 4&lt;br /&gt;
| Uncompressed size&lt;br /&gt;
| 未压缩的大小&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 2&lt;br /&gt;
| File name length (n)&lt;br /&gt;
| 文件名长度&lt;br /&gt;
|-&lt;br /&gt;
| 30&lt;br /&gt;
| 2&lt;br /&gt;
| Extra field length (m)&lt;br /&gt;
| 扩展域长度&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| 2&lt;br /&gt;
| File comment length (k)&lt;br /&gt;
| 文件注释长度&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| 2&lt;br /&gt;
| Disk number where file starts&lt;br /&gt;
| 文件开始位置的磁盘编号&lt;br /&gt;
|-&lt;br /&gt;
| 36&lt;br /&gt;
| 2&lt;br /&gt;
| Internal file attributes&lt;br /&gt;
| 内部文件属性&lt;br /&gt;
|-&lt;br /&gt;
| 38&lt;br /&gt;
| 4&lt;br /&gt;
| External file attributes&lt;br /&gt;
| 外部文件属性&lt;br /&gt;
|-&lt;br /&gt;
| 42&lt;br /&gt;
| 4&lt;br /&gt;
| relative offset of local header&lt;br /&gt;
| 本地文件头的相对位移&lt;br /&gt;
|-&lt;br /&gt;
| 46&lt;br /&gt;
| n&lt;br /&gt;
| File name&lt;br /&gt;
| 目录文件名&lt;br /&gt;
|-&lt;br /&gt;
| 46+n&lt;br /&gt;
| m&lt;br /&gt;
| Extra field&lt;br /&gt;
| 扩展域&lt;br /&gt;
|-&lt;br /&gt;
| 46+n+m&lt;br /&gt;
| k&lt;br /&gt;
| File comment&lt;br /&gt;
| 文件注释内容&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;End of central directory record(EOCD)&amp;lt;/code&amp;gt; 目录结束标识&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;目录结束标识存在于整个归档包的结尾，用于标记压缩的目录数据的结束。每个压缩文件必须有且只有一个 &amp;lt;code&amp;gt;EOCD&amp;lt;/code&amp;gt; 记录。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
更加详细参见 [https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt 官方文档]。&lt;br /&gt;
&lt;br /&gt;
== 主要攻击 ==&lt;br /&gt;
&lt;br /&gt;
=== 爆破 ===&lt;br /&gt;
&lt;br /&gt;
这里主要介绍两款爆破使用的工具&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;Windows&amp;lt;/code&amp;gt;下的神器 [http://www.downcc.com/soft/130539.html ARCHPR]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[[File:./figure/1.png]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;暴力枚举，跑字典，明文攻击，应有尽有。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;Linux&amp;lt;/code&amp;gt; 下的命令行工具 [https://github.com/hyc/fcrackzip fcrackzip]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;# －b 指定模式为暴破，-c1指定密码类型为纯数字，其它类型可以rtfm,-u这个参数非常重要不然不显示破解出来的密码,-l 5-6可以指定长度&lt;br /&gt;
root@kali:fcrackzip -b -c1 -u test.zip&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;crc32&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== CRC32 ===&lt;br /&gt;
&lt;br /&gt;
==== 原理 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CRC&amp;lt;/code&amp;gt; 本身是「冗余校验码」的意思，&amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 则表示会产生一个 &amp;lt;code&amp;gt;32 bit&amp;lt;/code&amp;gt; ( &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; 位十六进制数)的校验值。由于 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 产生校验值时源数据块的每一个 &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt; (位)都参与了计算，所以数据块中即使只有一位发生了变化，也会得到不同的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 值。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 校验码出现在很多文件中比如 &amp;lt;code&amp;gt;png&amp;lt;/code&amp;gt; 文件，同样 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; 中也有 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 校验码。值得注意的是 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; 中的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 是未加密文件的校验值。&lt;br /&gt;
&lt;br /&gt;
这也就导致了基于 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 的攻击手法。&lt;br /&gt;
&lt;br /&gt;
* 文件内内容很少(一般比赛中大多为 &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; 字节左右)&lt;br /&gt;
* 加密的密码很长&lt;br /&gt;
&lt;br /&gt;
我们不去爆破压缩包的密码，而是直接去爆破源文件的内容(一般都是可见的字符串)，从而获取想要的信息。&lt;br /&gt;
&lt;br /&gt;
比如我们新建一个 &amp;lt;code&amp;gt;flag.txt&amp;lt;/code&amp;gt;，其中内容为 &amp;lt;code&amp;gt;123&amp;lt;/code&amp;gt;，使用密码 &amp;lt;code&amp;gt;!QAZXSW@#EDCVFR$&amp;lt;/code&amp;gt; 去加密。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/2.png]]&lt;br /&gt;
&lt;br /&gt;
而我们去计算文件的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 值发现和上图中的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 值吻合。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;文件: flag.txt&lt;br /&gt;
大小: 3&lt;br /&gt;
时间: Tue, 29 Aug 2017 10:38:10 +0800&lt;br /&gt;
MD5: 202cb962ac59075b964b07152d234b70&lt;br /&gt;
SHA1: 40bd001563085fc35165329ea1ff5c5ecbdbbeef&lt;br /&gt;
CRC32: 884863D2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
!!! note ​ 在爆破时我们所枚举的所有可能字符串的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 值是要与压缩源文件数据区中的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 值所对应&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import binascii&lt;br /&gt;
import base64&lt;br /&gt;
import string&lt;br /&gt;
import itertools&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
alph = &amp;#039;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=&amp;#039;&lt;br /&gt;
&lt;br /&gt;
crcdict = {}&lt;br /&gt;
print &amp;quot;computing all possible CRCs...&amp;quot;&lt;br /&gt;
for x in itertools.product(list(alph), repeat=4):&lt;br /&gt;
    st = &amp;#039;&amp;#039;.join(x)&lt;br /&gt;
    testcrc = binascii.crc32(st)&lt;br /&gt;
    crcdict[struct.pack(&amp;#039;&amp;lt;i&amp;#039;, testcrc)] = st&lt;br /&gt;
print &amp;quot;Done!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
f = open(&amp;#039;flag.zip&amp;#039;)&lt;br /&gt;
data = f.read()&lt;br /&gt;
f.close()&lt;br /&gt;
crc = &amp;#039;&amp;#039;.join(data[14:18])&lt;br /&gt;
if crc in crcdict:&lt;br /&gt;
    print crcdict[crc]&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;FAILED!&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== 例题 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;题目：&amp;lt;code&amp;gt;Abctf-2016:Zippy&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
根据每个压缩包内的文件大小可以推断使用 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 攻击手法，获得每个压缩包内的内容后连在一起 &amp;lt;code&amp;gt;Base64&amp;lt;/code&amp;gt; 解码后是一个加密的压缩包，爆破获得 &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
=== 明文攻击 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;原理-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 原理 ====&lt;br /&gt;
&lt;br /&gt;
* 一个加密的压缩文件&lt;br /&gt;
* 压缩文件的压缩工具，比如 &amp;lt;code&amp;gt;2345&amp;lt;/code&amp;gt; 好压， &amp;lt;code&amp;gt;WinRAR&amp;lt;/code&amp;gt; ， &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 。 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; 版本号等，可以通过文件属性了解。如果是 &amp;lt;code&amp;gt;Linux&amp;lt;/code&amp;gt; 平台，用 &amp;lt;code&amp;gt;zipinfo -v&amp;lt;/code&amp;gt; 可以查看一个 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; 包的详细信息，包括加密算法等&lt;br /&gt;
* 知道压缩包里某个文件的部分连续内容(至少 &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; 字节)&lt;br /&gt;
&lt;br /&gt;
如果你已经知道加密文件的部分内容，比如在某个网站上发现了它的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 文件，你就可以开始尝试破解了。&lt;br /&gt;
&lt;br /&gt;
首先，将这个明文文件打包成 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; 包，比如将 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 打包成 &amp;lt;code&amp;gt;readme.zip&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
打包完成后，需要确认二者采用的压缩算法相同。一个简单的判断方法是用 &amp;lt;code&amp;gt;WinRAR&amp;lt;/code&amp;gt; 打开文件，同一个文件压缩后的体积是否相同。如果相同，基本可以说明你用的压缩算法是正确的。如果不同，就尝试另一种压缩算法。&lt;br /&gt;
&lt;br /&gt;
==== 工具 ====&lt;br /&gt;
&lt;br /&gt;
* Windows下的神器 [http://www.downcc.com/soft/130539.html ARCHPR]&lt;br /&gt;
* Linux下的 [http://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html PKCrack]&lt;br /&gt;
&lt;br /&gt;
!!! note ​ 建议使用 &amp;lt;code&amp;gt;Windows&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;ARCHPR&amp;lt;/code&amp;gt;，一是速度较快，二是较稳定（之前出题时遇到过用 &amp;lt;code&amp;gt;PKCrack&amp;lt;/code&amp;gt; 爆不出来的情况）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;例题-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 例题 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;2015广州强网杯：爆破？&lt;br /&gt;
&lt;br /&gt;
WP：https://www.cnblogs.com/ECJTUACM-873284962/p/9884416.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
首先我们拿到这样一道题，题目标题为&amp;#039;&amp;#039;&amp;#039;爆破?&amp;#039;&amp;#039;&amp;#039;，很明显这题肯定是要用到一个破解工具，很暴力的说。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;第一步、分析压缩包文件&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
我们下载了这个压缩包以后，我们看到文件名是 *&amp;#039;&amp;#039;&amp;#039;.zip&amp;#039;&amp;#039;&amp;#039; 结尾，我们可以立即想到破解压缩包常用的几种方式，我们将其压缩包解压出来，发现里面有两个文件，分别为 &amp;lt;code&amp;gt;Desktop.zip&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; ，我们看看 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 里面写了什么？&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/readme.png|readme]]&lt;br /&gt;
&lt;br /&gt;
打开以后竟然是&amp;lt;code&amp;gt;qianwanbuyaogeixuanshoukandao!!!&amp;lt;/code&amp;gt; ，出题人不想让选手看到，这出题人还是有点意思。我们再看看那个 &amp;lt;code&amp;gt;Desktop.zip&amp;lt;/code&amp;gt; ，我们可以看到里面有个 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 文件和 &amp;lt;code&amp;gt;answer&amp;lt;/code&amp;gt; 文件夹， &amp;lt;code&amp;gt;answer&amp;lt;/code&amp;gt; 文件夹下有 &amp;lt;code&amp;gt;key.txt&amp;lt;/code&amp;gt; 文件， &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt; 应该就藏在这里了。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;第二步、分析破解方式&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
这题目拿到手上，我们首先发现解压出来的文件和 &amp;lt;code&amp;gt;Desktop.zip&amp;lt;/code&amp;gt; 压缩包中都含有同样一个文件 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; ，而且并没有给出其他相关信息，且文件大小大于 &amp;lt;code&amp;gt;12Byte&amp;lt;/code&amp;gt; ，我们再对比压缩包中的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 和原压缩包中的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;CRC32&amp;lt;/code&amp;gt; 的值，我们发现两个值相同，这说明解压出的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 是加密压缩包里的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 的明文，于是我们可以大胆地猜测这极可能是个明文加密。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/compare.png|compare]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;第三步、尝试明文攻击&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
既然我们已经知道了它是明文攻击的话，我们将对其压缩包进行破解，由于解压出的readme.txt是加密压缩包里的 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 的明文，将 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 压缩成 &amp;#039;&amp;#039;&amp;#039;.zip&amp;#039;&amp;#039;&amp;#039; 文件，然后在软件中填入相应的路径即可开始进行明文攻击，这里我们将介绍 &amp;lt;code&amp;gt;Windows&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;Ubuntu&amp;lt;/code&amp;gt; 下使用不同的方式进行明文攻击。&lt;br /&gt;
&lt;br /&gt;
方法一、 &amp;lt;code&amp;gt;pkcrack&amp;lt;/code&amp;gt; 进行明文攻击&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pkcrack&amp;lt;/code&amp;gt; 下载链接：https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html&lt;br /&gt;
&lt;br /&gt;
我们可以直接写个 &amp;lt;code&amp;gt;shell&amp;lt;/code&amp;gt; 脚本下载就好了：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/bash -ex&lt;br /&gt;
&lt;br /&gt;
wget https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz&lt;br /&gt;
tar xzf pkcrack-1.2.2.tar.gz&lt;br /&gt;
cd pkcrack-1.2.2/src&lt;br /&gt;
make&lt;br /&gt;
&lt;br /&gt;
mkdir -p ../../bin&lt;br /&gt;
cp extract findkey makekey pkcrack zipdecrypt ../../bin&lt;br /&gt;
cd ../../&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
把文件保存，改为 &amp;lt;code&amp;gt;pkcrack-install.sh&amp;lt;/code&amp;gt; ，然后跑到当前目录下，给它加一个执行权限 &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;chmod 777 install.sh&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
或者直接可以：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;chmod u+x install.sh&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
然后运行 &amp;lt;code&amp;gt;./pkcrack-install.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/install-pkcrack.png|install-pkcrack]]&lt;br /&gt;
&lt;br /&gt;
然后当前目录下会生成一个 &amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt; 的文件夹，我们直接进入 &amp;lt;code&amp;gt;bin&amp;lt;/code&amp;gt; 文件夹下，看到有 &amp;lt;code&amp;gt;pkcrack&amp;lt;/code&amp;gt; 文件，直接对文件进行明文破解。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;./pkcrack -c &amp;quot;readme.txt&amp;quot; -p readme.txt  -C ~/下载/misc/Desktop.zip -P ~/下载/misc/readme.zip -d ~/decrypt.zip&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
我们所用到的参数选项如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;-C:要破解的目标文件(含路径)&lt;br /&gt;
&lt;br /&gt;
-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)&lt;br /&gt;
&lt;br /&gt;
-P:压缩后的明文文件&lt;br /&gt;
&lt;br /&gt;
-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)&lt;br /&gt;
-d:指定文件名及所在的绝对路径，将解密后的zip文件输出&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
至于其他选项参看 &amp;lt;code&amp;gt;./pkcrack --help&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
解密后的结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/pkcrack-to-flag-01.png|pkcrack-to-flag]]&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/pkcrack-to-flag-02.png|pkcrack-to-flag]]&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/pkcrack-to-flag-03.png|pkcrack-to-flag]]&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/pkcrack-to-flag-04.png|pkcrack-to-flag]]&lt;br /&gt;
&lt;br /&gt;
我们可以看到，我们下午 &amp;lt;code&amp;gt;1:10&amp;lt;/code&amp;gt; 开始跑的，下午 &amp;lt;code&amp;gt;3:27&amp;lt;/code&amp;gt; 才求解出秘钥。&lt;br /&gt;
&lt;br /&gt;
我们得出了最终的flag为：&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;flag{7ip_Fi13_S0m3tim3s_s0_3a5y@}&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;坑点来了&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
看起来一切都很顺利的样子，同样花了两个多小时，为啥我在博客园上写了我跑了两个小时都没跑出来呢？或者说有朋友遇到了和我一样的问题，我明明和你是一样的，为啥我跑不出结果？&lt;br /&gt;
&lt;br /&gt;
你们可能忽略了一些细节问题，有人曾想过原压缩包是通过什么方式压缩的嘛？还有就是我们生成的 &amp;lt;code&amp;gt;readme.zip&amp;lt;/code&amp;gt; 又该以哪种方式去生成呢？我就是因为这个问题卡了整整三个月没做出来，不信的话我们可以看看第二种方法，在 &amp;lt;code&amp;gt;Windows&amp;lt;/code&amp;gt; 下用 &amp;lt;code&amp;gt;ARCHPR&amp;lt;/code&amp;gt; 进行明文攻击。&lt;br /&gt;
&lt;br /&gt;
方法二、 &amp;lt;code&amp;gt;ARCHPR&amp;lt;/code&amp;gt; 进行明文攻击&lt;br /&gt;
&lt;br /&gt;
首先这题我建议大家下 &amp;lt;code&amp;gt;ARCHPR 4.53&amp;lt;/code&amp;gt; 版本，我是在这个版本下测试成功的。成功截图如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/success.jpg|success]]&lt;br /&gt;
&lt;br /&gt;
我相信很多朋友在用 &amp;lt;code&amp;gt;ARCHPR&amp;lt;/code&amp;gt; 的时候遇到以下这种情况：&lt;br /&gt;
&lt;br /&gt;
[[File:figure/error.png|error]]&lt;br /&gt;
&lt;br /&gt;
我当时内心是崩溃的，为啥会出现这种情况。&lt;br /&gt;
&lt;br /&gt;
在后来的学习中发现，用 &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 压缩的文件得用 &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 来解压缩， &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 是一种使用多种压缩算法进行数据压缩的档案格式，和传统的 &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; ， &amp;lt;code&amp;gt;rar&amp;lt;/code&amp;gt; 相比，它的压缩比率更大，采用的压缩算法不同，自然而然就可能出现不匹配这种情况，所以我们在解压缩原压缩包和对文件进行加密的时候得先分析出题人是用什么方式进行加解密的，所以这题的问题显而易见就出来了，经过验证，我发现出题人是用 &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 进行压缩的。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;再尝试&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
我们已经发现了这个问题，我们去官网下载 &amp;lt;code&amp;gt;7zip&amp;lt;/code&amp;gt; ：https://www.7-zip.org/&lt;br /&gt;
&lt;br /&gt;
然后我们对原压缩文件用 &amp;lt;code&amp;gt;7z&amp;lt;/code&amp;gt; 进行解压缩，然后将 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt; 用7z进行压缩即可。然后我们就可以用 &amp;lt;code&amp;gt;ARCHPR&amp;lt;/code&amp;gt; 进行明文攻击了。&lt;br /&gt;
&lt;br /&gt;
结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/attack-success.png|attack-success]]&lt;br /&gt;
&lt;br /&gt;
我们将 &amp;lt;code&amp;gt;Desktop_decrypted.zip&amp;lt;/code&amp;gt; 解压出来，查看 &amp;lt;code&amp;gt;answer&amp;lt;/code&amp;gt; 目录下的 &amp;lt;code&amp;gt;key.txt&amp;lt;/code&amp;gt; 即可。&lt;br /&gt;
&lt;br /&gt;
所以最终的flag为：&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;flag{7ip_Fi13_S0m3tim3s_s0_3a5y@}&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== 伪加密 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;原理-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 原理 ====&lt;br /&gt;
&lt;br /&gt;
在上文 &amp;lt;code&amp;gt;ZIP&amp;lt;/code&amp;gt; 格式中的 &amp;#039;&amp;#039;&amp;#039;核心目录区&amp;#039;&amp;#039;&amp;#039; 中，我们强调了一个叫做通用位标记 &amp;lt;code&amp;gt;(General purpose bit flag)&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; 字节，不同比特位有着不同的含义。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Bit 0: If set, indicates that the file is encrypted.&lt;br /&gt;
&lt;br /&gt;
(For Method 6 - Imploding)&lt;br /&gt;
Bit 1: If the compression method used was type 6,&lt;br /&gt;
     Imploding, then this bit, if set, indicates&lt;br /&gt;
     an 8K sliding dictionary was used.  If clear,&lt;br /&gt;
     then a 4K sliding dictionary was used.&lt;br /&gt;
...&lt;br /&gt;
Bit 6: Strong encryption.  If this bit is set, you should&lt;br /&gt;
     set the version needed to extract value to at least&lt;br /&gt;
     50 and you must also set bit 0.  If AES encryption&lt;br /&gt;
     is used, the version needed to extract value must&lt;br /&gt;
     be at least 51.&lt;br /&gt;
...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在 &amp;lt;code&amp;gt;010Editor&amp;lt;/code&amp;gt; 中我们尝试着将这 &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; 位修改 &amp;lt;code&amp;gt;0 --&amp;amp;gt; 1&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/4.png]]&lt;br /&gt;
&lt;br /&gt;
再打开文件发现已要求输入密码。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/5.png]]&lt;br /&gt;
&lt;br /&gt;
修改伪加密的方法：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; 进制下修改通用位标记&lt;br /&gt;
* &amp;lt;code&amp;gt;binwalk -e&amp;lt;/code&amp;gt; 无视伪加密&lt;br /&gt;
* 在 &amp;lt;code&amp;gt;Mac OS&amp;lt;/code&amp;gt; 及部分 &amp;lt;code&amp;gt;Linux&amp;lt;/code&amp;gt;(如 &amp;lt;code&amp;gt;Kali&amp;lt;/code&amp;gt; )系统中，可以直接打开伪加密的 &amp;lt;code&amp;gt;ZIP&amp;lt;/code&amp;gt; 压缩包&lt;br /&gt;
* 检测伪加密的小工具 &amp;lt;code&amp;gt;ZipCenOp.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
* 有时候用 &amp;lt;code&amp;gt;WinRar&amp;lt;/code&amp;gt; 的修复功能（此方法有时有奇效，不仅针对伪加密）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;例题-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 例题 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;code&amp;gt;SSCTF-2017&amp;lt;/code&amp;gt; ：我们的秘密是绿色的&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;WP&amp;lt;/code&amp;gt;：http://bobao.360.cn/ctf/detail/197.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
我们在得到两个 &amp;lt;code&amp;gt;readme.txt&amp;lt;/code&amp;gt;，且一个加密，一个已知，很容易想到明文攻击的手法。&lt;br /&gt;
&lt;br /&gt;
注意在用明文攻击时的操作。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/3.png]]&lt;br /&gt;
&lt;br /&gt;
得到密码 &amp;lt;code&amp;gt;Y29mZmVl&amp;lt;/code&amp;gt; 后，解压缩文件，得到另一个压缩包。&lt;br /&gt;
&lt;br /&gt;
观察通用位标记位，猜测伪加密，修改后解压得到 flag。&lt;br /&gt;
&lt;br /&gt;
这一题，基本涵盖了比赛中 ZIP 的常见考察手法，爆破，伪加密，明文攻击等，都在本题中出现。&lt;br /&gt;
&lt;br /&gt;
=== 参考文献 ===&lt;br /&gt;
&lt;br /&gt;
* https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt&lt;br /&gt;
* https://www.cnblogs.com/ECJTUACM-873284962/p/9387711.html&lt;br /&gt;
* https://www.cnblogs.com/ECJTUACM-873284962/p/9884416.html&lt;br /&gt;
* http://bobao.360.cn/ctf/detail/197.html&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>