那些CTF中的神操作之ZIP压缩包

1,871 阅读4分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

前言

CTF-MISC中关于压缩包的隐写题目也是经常出的,今天带给大家的是ZIP压缩包的一些谜之操作,希望大家有所收获。

简介

ZIP(文件头,文件尾:50 4B 03 04,50 4B 05 06)百度详细解释:

ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。当前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。MicrosoftWindows ME操作系统开始内置对zip格式的支持,即使用户的计算机上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux操作系统也对zip格式提供了类似的支持。因此如果在网络上传播和分发文件,zip格式往往是最常用的选择。

伪加密

有一些ZIP加密有可能是伪加密,并不需要任何密码。具体原理如下:

文件数据区

  50 4B 03 04:这是头文件标记  (0x04034b50)

          14 00:解压文件所需 pkware 版本

          00 00:全局方式位标记(判断有无加密)

          08 00:压缩方式

          5A 7E:最后修改文件时间

          F7 46:最后修改文件日期

文件目录区

 50 4B 01 02:目录中文件文件头标记  (0x02014b50)

         1F 00:压缩使用的 pkware 版本

         14 00:解压文件所需 pkware 版本

         00 00:全局方式位标记(判断是否为伪加密)

         08 00:压缩方式

          5A 7E:最后修改文件时间

          F7 46:最后修改文件日期

判断方式:

压缩源文件数据区的全局方式位标记应当为 00 00  (50 4B 03 04 14 00 后)

且压缩源文件目录区的全局方式位标记应当为 09 00   (50 4B 01 02 14 00 后)

解决方法(只提供部分):

1.使用binwalk命令进行分解

2.尝试修改数据破除伪加密

3.使用解压工具进行修复

真加密

若压缩包是真正需要密码的时候,我们应该怎么办呢。

爆破

有的时候考察爆破,常见的是数字爆破,也会有单纯字母的爆破。

使用工具:Advanced Archive Password Recovery

密码有时候不是通过爆破获得的,出题人可能以其他的形式隐写密码。

明文攻击

明文攻击的原理:攻击者掌握了某段明文和对应密文求解密钥

对于zip文件来说,进行明文攻击的条件是:有一个单独的文件已知且进行压缩之后的CRC值与某个包含此文件的压缩包的CRC值相等。

满足以上要求便可以尝试明文攻击来破解。

CRC32爆破

CRC32校验码就是用来检验文件内的数据是否正确的。信息不能从校验码复原,因为加密过程有损失,或者本来就没把完整的信息丢进去,但是可以从校验码发现信息是否有修改,因为校验码是以信息为明文加密的。

若信息足够小校验码就可以用来检验爆破的枚举的信息是否是从前的信息。也就是我们所说的爆破。在网上可以找到脚本去爆破相应的题目。

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
# python3
import zipfile
import string
import binascii




def CrackCrc(crc):
    for i in dic:
        for j in dic:
            for k in dic:
                for h in dic:
                    s = i + j + k + h
                    if crc == (binascii.crc32(s.encode())):
                        f.write(s)
                        return




def CrackZip():
    for i in range(0, 68):
        file = "file_path"+'out' + str(i) + '.zip'
        crc = zipfile.ZipFile(file, 'r').getinfo('data.txt').CRC
        CrackCrc(crc)
        print('\r' + "loading:{:%}".format(float((i + 1) / 68)), end='')




dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt', 'w')
print("\nCRC32begin")
CrackZip()
print("CRC32finished")
f.close()

结尾

以上给大家带来的是一些ZIP压缩包的一些套路,是不是很有创意,大家学会了也可以自己尝试加密或破解一下,若大家还有知道其他的创意套路也可以在评论区留言互相学习,感谢阅读。