本文主要是介绍二、压缩包隐写[伪加密、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
,这时就能发现,压缩包头和压缩源文件目录区的头最后四位不一致,此时就产生了伪加密
解决伪加密的办法:
- 使用010editor去手动修改
- 使用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是4比特的情况,如果为6比特写6个for循环
# 参数crc 为压缩包里面文件CRC32的值
import string
import binasciidic = string.ascii_letters + string.digits + '+/='
crc = 0x0BB21560for a in dic:for b in dic:for c in dic:for d in dic:s = a+b+c+dencoded_s = s.encode('utf-8') # 编码后的 sif binascii.crc32(encoded_s) & 0xffffffff == crc:print(s)exit(0)
读取文件获取CRC32值
import string
import binascii
import zipfiledic = 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 + dencoded_s = s.encode('utf-8') # 编码后的 sif binascii.crc32(encoded_s) & 0xffffffff == crc:return sreturn 0def 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.CRCreturn crc_valuesbase = 'D:\工作\安全\Misc\zip'
str = ''
for i in range(0, 68):# 此处有68个文件,文件名为out0.zip-out67.zipzip_file_name = base + f'\\out{i}.zip'crc_list = get_CRC32(zip_file_name)# 遍历每一个压缩文件里面的每一个文件的CRCfor j in crc_list.items():# 将获取的CRC32放入函数进行破解,然后将值进行拼接crc = j[1]crc = crash_CRC32(crc)if crc == 0:print('发生未知错误')exit(0)str += crcprint(str)
print(str)
三、压缩包已知明文攻击
解释:压缩包里面包含文件A和文件B,但此时,已经得到了文件A,我们就可以通过已知明文攻击去获取文件B
示例:
- 获取压缩包,里面包含A和B;同时获取A(未被加密)
2. 先压缩已知明文文件logo.png,压缩完后查看里面CRC32与flag.zip的logo.png的CRC32数值是否相同
3. 使用ARCHPR工具的明文攻击
注意点:无需等待得出密钥(太慢),即使有时没有恢复密码(长时间没有解出来就停止),也可以使用明文攻击,最后点保存还是能得到压缩包里内容的。
四、RAR压缩包修复
解释:缺少RAR4标头时,在010Editor插入52 61 72 21 1A 07 00
;缺少RAR5标头时,在010Editor插入52 61 72 21 1A 07 01 00
补充:
-
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(结束块)
-
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修改成正确的值即可
这篇关于二、压缩包隐写[伪加密、CRC32碰撞、已知明文攻击、RAR压缩包修复]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!