很久之前就遇到了,感觉有点繁琐和难就跳过去了,一直拖不是办法。
下载附件得到:
67个加密的压缩包:
这里总结介绍一下对于加密的压缩包的常见处理方法,伪加密这里未涉及就不说了(就是修改了标识位,用修复脚本跑就行)。对于加密的压缩包,我们通常有会对其进行检查,有无提示信息,对于没有提示信息类的就只能采取暴力破解,暴力破解无非是使用可能的密码尝试进行解压操作,可行的方法有两种:
1. 通过密码字典收集的常用密码进行破解
2. 通过穷举可能的密码进行破解
第一种就不多说了,这里用到和涉及到的是第二种, 有种基于CRC32来还原压缩包内容的方法。
CRC:全称是循环冗余校验(Cyclic Redundancy Check,CRC),用来检验文件是否出错。
CRC32表示会产生一个32bit(8位十六进制数)的校验值。
计算CRC32的值,这里介绍一下Python提供的库函数来计算,Python的binascii模块。
因为计算出来的结果是一个有符号数,所以可能会看到结果为负数,因此需要将结果和0xFFFFFFFF进行一个位运算与操作
import binasciidef calcCRC32(s):crc = binascii.crc32(s)return crc & 0xFFFFFFFF
对于本题中给出的加密的压缩包,里面的txt原始的大小只有4个字节,我们可以尝试枚举可能的4字节内容,然后计算CRC32值来进行校验。
有了上面的介绍,脚本就好理解了。
import zipfileimport stringimport binasciidef CrackCrc(crc):for a in dic:for b in dic:for c in dic:for d in dic:e = a + b + c + dif crc == (binascii.crc32(e.encode())):f.write(e)return #对比枚举的Crc是否正确dic = string.ascii_letters + string.digits + '+/=' #确定枚举字典的范围,调用的string库def CrackZip():for i in range(68):file = 'out' + str(i) + '.zip'f = zipfile.ZipFile(file, 'r')GetCrc = f.getinfo('data.txt')crc = GetCrc.CRC #获取数据# print(hex(crc))CrackCrc(crc)f = open('out.txt', 'w')CrackZip()f.close()
string库函数的简介:ascii_letters 大小写字母常数print(string.ascii_letters)#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZascii_lowercase 小写字母常数print(string.ascii_lowercase)# abcdefghijklmnopqrstuvwxyzdigits 十进制数字常数print(string.digits)# 0123456789


看样子要修复压缩包
应该是这个数据
对比正确的rar,这个应该是缺头少尾。
RAR16进制文件头:52 61 72 21 1A 07 00
RAR16进制文件尾:C4 3D 7B 00 40 07 00
这里就没再放010Editor里面弄,直接Cyberchef里面加上的。
然后保存,在压缩包的注释里得到flag,解完压得到的flag.txt是提示:

其余的CRC爆破的还没怎么遇到,这里就不先总结了。
