很久之前就遇到了,感觉有点繁琐和难就跳过去了,一直拖不是办法。
    下载附件得到:
    图片.png
    67个加密的压缩包:
    图片.png这里总结介绍一下对于加密的压缩包的常见处理方法,伪加密这里未涉及就不说了(就是修改了标识位,用修复脚本跑就行)。对于加密的压缩包,我们通常有会对其进行检查,有无提示信息,对于没有提示信息类的就只能采取暴力破解,暴力破解无非是使用可能的密码尝试进行解压操作,可行的方法有两种:
    1. 通过密码字典收集的常用密码进行破解
    2. 通过穷举可能的密码进行破解
    第一种就不多说了,这里用到和涉及到的是第二种, 有种基于CRC32来还原压缩包内容的方法。
    CRC:全称是循环冗余校验(Cyclic Redundancy Check,CRC),用来检验文件是否出错。
    CRC32表示会产生一个32bit(8位十六进制数)的校验值。
    图片.png计算CRC32的值,这里介绍一下Python提供的库函数来计算,Python的binascii模块。
    因为计算出来的结果是一个有符号数,所以可能会看到结果为负数,因此需要将结果和0xFFFFFFFF进行一个位运算与操作

    1. import binascii
    2. def calcCRC32(s):
    3. crc = binascii.crc32(s)
    4. return crc & 0xFFFFFFFF

    对于本题中给出的加密的压缩包,里面的txt原始的大小只有4个字节,我们可以尝试枚举可能的4字节内容,然后计算CRC32值来进行校验。
    有了上面的介绍,脚本就好理解了。

    1. import zipfile
    2. import string
    3. import binascii
    4. def CrackCrc(crc):
    5. for a in dic:
    6. for b in dic:
    7. for c in dic:
    8. for d in dic:
    9. e = a + b + c + d
    10. if crc == (binascii.crc32(e.encode())):
    11. f.write(e)
    12. return #对比枚举的Crc是否正确
    13. dic = string.ascii_letters + string.digits + '+/=' #确定枚举字典的范围,调用的string库
    14. def CrackZip():
    15. for i in range(68):
    16. file = 'out' + str(i) + '.zip'
    17. f = zipfile.ZipFile(file, 'r')
    18. GetCrc = f.getinfo('data.txt')
    19. crc = GetCrc.CRC #获取数据
    20. # print(hex(crc))
    21. CrackCrc(crc)
    22. f = open('out.txt', 'w')
    23. CrackZip()
    24. f.close()
    1. string库函数的简介:
    2. ascii_letters 大小写字母常数
    3. print(string.ascii_letters)
    4. #abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
    5. ascii_lowercase 小写字母常数
    6. print(string.ascii_lowercase)
    7. # abcdefghijklmnopqrstuvwxyz
    8. digits 十进制数字常数
    9. print(string.digits)
    10. # 0123456789

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