二、压缩包隐写[伪加密、CRC32碰撞、已知明文攻击、RAR压缩包修复]

一、压缩包加密

1.压缩包伪加密

原理:ZIP压缩包的头固定为05 4B 03 04,其中还有一个叫压缩源文件目录区的固定头为50 4B 01 02,其中对于正常压缩而言,压缩包的头05 4B 03 04 XX XX 00 00,压缩源文件目录区的头为50 4B 01 02 XX XX XX XX 00 00;加密压缩的为缩包的头05 4B 03 04 XX XX 01 00,压缩源文件目录区的固定头为50 4B 01 02 XX XX XX XX 01 00,它们关键就在于里面最后四位0000为正常压缩;0100为加密压缩

伪加密:压缩包的头:05 4B 03 04 XX XX 00 00;压缩源文件目录区的头:50 4B 01 02 XX XX XX XX 09 00,这时就能发现,压缩包头和压缩源文件目录区的头最后四位不一致,此时就产生了伪加密

解决伪加密的办法:

  1. 使用010editor去手动修改
  2. 使用360压缩,直接无视伪加密

在这里插入图片描述

2.压缩包暴力破解

工具:ARCHPR
下载地址:https://wwz.lanzoul.com/iduDK0c666ef(密码:52pj)

二、CRC32碰撞

工具:WinRAR(下载地址:https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20231013/rrlb/winrar-x64-624sc.exe;授权文件:https://developer.aliyun.com/article/297800)

解释:当压缩包被加密,密码又很难破解出来时;同时被加密的文本文档大小很小(CTF里面一般4KB),可以采取CRC32碰撞,碰撞成功后,该文件的原文将会被破解出来

代码:

# 参数crc 为压缩包里面文件CRC32的值
import itertools
import string
import binascii

dic = string.ascii_letters + string.digits + '+/='
crc = 0x3D958D68


for secret_number in itertools.product(dic, repeat=4):
    secret_number = ''.join(secret_number)  # 转换元组为字符串
    encoded_s = secret_number.encode('utf-8')  # 编码后的 s
    if binascii.crc32(encoded_s) & 0xffffffff == crc:
        print(secret_number)
        exit(0)

读取文件获取CRC32值

import string
import binascii
import zipfile

dic = string.ascii_letters + string.digits + '+/='


def crash_CRC32(crc):
    for a in dic:
        for b in dic:
            for c in dic:
                for d in dic:
                    s = a + b + c + d
                    encoded_s = s.encode('utf-8')  # 编码后的 s
                    if binascii.crc32(encoded_s) & 0xffffffff == crc:
                        return s
    return 0


def get_CRC32(zip_file_name):
    # 打开 zip 文件
    with zipfile.ZipFile(zip_file_name, 'r') as zip:
        # 使用字典来存储文件名与其 CRC32 值的映射
        crc_values = {}
        # 遍历 zip 文件中的每一个条目
        for zip_info in zip.infolist():
            # 将文件名和对应的 CRC32 值存入字典
            crc_values[zip_info.filename] = zip_info.CRC
        return crc_values


base = 'D:\工作\安全\Misc\zip'
str = ''
for i in range(0, 68):
    # 此处有68个文件,文件名为out0.zip-out67.zip
    zip_file_name = base + f'\\out{i}.zip'
    crc_list = get_CRC32(zip_file_name)
    # 遍历每一个压缩文件里面的每一个文件的CRC
    for j in crc_list.items():
        # 将获取的CRC32放入函数进行破解,然后将值进行拼接
        crc = j[1]
        crc = crash_CRC32(crc)
        if crc == 0:
            print('发生未知错误')
            exit(0)
        str += crc
        print(str)
print(str)

三、压缩包已知明文攻击

解释:压缩包里面包含文件A和文件B,但此时,已经得到了文件A,我们就可以通过已知明文攻击去获取文件B

示例:

  1. 获取压缩包,里面包含A和B;同时获取A(未被加密)

在这里插入图片描述
2. 先压缩已知明文文件logo.png,压缩完后查看里面CRC32与flag.zip的logo.png的CRC32数值是否相同
在这里插入图片描述
3. 使用ARCHPR工具的明文攻击

在这里插入图片描述

注意点:无需等待得出密钥(太慢),即使有时没有恢复密码(长时间没有解出来就停止),也可以使用明文攻击,最后点保存还是能得到压缩包里内容的。如下图(图1是等待过程),等到图二界面显示时,之间点停止,然后点确认就能获得解密后的压缩文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、RAR压缩包修复

解释:缺少RAR4标头时,在010Editor插入52 61 72 21 1A 07 00;缺少RAR5标头时,在010Editor插入52 61 72 21 1A 07 01 00

补充:

  1. RAR4中的HEAD_TYPE

    HEAD_TYPE = 0x72 - MARK_HEAD(标记块)
    HEAD_TYPE = 0x73 - MAIN_HEAD(压缩文件头)
    HEAD_TYPE = 0x74 - FILE_HEAD(文件头)
    HEAD_TYPE = 0x75 - COMM_HEAD(旧风格的注释头)
    HEAD_TYPE = 0x76 - AV_HEAD(旧风格的授权信息块/用户身份信息块)
    HEAD_TYPE = 0x77 - SUB_HEAD(旧风格的子块)
    HEAD_TYPE = 0x78 - PROTECT_HEAD(旧风格的恢复记录)
    HEAD_TYPE = 0x79 - SIGN_HEAD(旧风格的授权信息块/用户身份信息块)
    HEAD_TYPE = 0x7A - NEWSUB_HEAD(子块)
    HEAD_TYPE = 0x7B - ENDARC_HEAD(结束块)
    
  2. RAR5中的HEAD_TYPE

      0x01 - 压缩文档头。
      0x02 - 文件头。
      0x03 - 服务头。
      0x04 - 压缩文档加密头。
      0x05 - 结尾块。
    

文件头修复:对于某文件的文件头损坏,很可能就是HEAD_TYPE被修改。对RAR4而言,里面如果压缩了多个文件,每个文件当中会间隔HEAD_CRC(2位) HEAD_TYPE;对RAR5而言,里面如果压缩了多个文件,每个文件当中会间隔HEAD_CRC(4位) HEAD_SIZE HEAD_TYPE,正常情况下HEAD_TYPE取值为0x74(RAR4)或0x02(RAR5)此时如果想修复文件头损坏就将HEAD_TYPE修改成正确的值即可

在这里插入图片描述

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值