CTF解题技能之压缩包分析进阶篇

上次斗哥的压缩包分析介绍了基础分析和伪加密分析,这次就和斗哥继续来学习压缩包分析的暴力破解、明文攻击和CRC32碰撞的解题思路吧。

暴力破解

暴力破解就是通过不断枚举选定集合中的密码组合,直到得到正确密码。还有字典攻击和掩码攻击也是差不多的,只是因为字典攻击一般包含了一些常见的密码,而掩码攻击是包含了已知密码部分,因此后两者的爆破速率较高与暴力破解。

在此,不得不提ARCHPR,ARCHPR是一款非常好用的压缩包爆破工具,如下图所示,简单的介绍了爆破工具的使用界面,详细操作后面会举例示范。

举个栗子

1.以某CTF杂项题中的一部分解题过程为例。

2.打开提示的图片,发现明显的提醒我们密码为3个数。

3.打开ARCHPR,点击“打开”,选择需要解密的压缩包并且点击确定。

4.由提示可知,暴力范围选择纯数字,并且选择攻击类型为“暴力”。

5.由提示可知,选择口令长度为3个字符。

6.由于密码较短,可快速爆破得到密码,可成功解压。

明文攻击

明文攻击指的是有一个加密的ZIP和一个未加密的压缩包中包含的文件,由于同一个ZIP压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以使用已知文件推测出密钥并解密ZIP文件的攻击方式,相比暴力破解,这种方法在破解密码较为复杂的压缩包时效率更高。

举个栗子

1.某题,提供了一张图片和一个压缩包。

2.发现压缩包加密,且压缩包中有一张图片和外面的图片命名是一样的,猜测为明文攻击。

3.使用winRAR将图片进行压缩后发现,压缩包中的图片和压缩后的图片的CRC32值是一样的,确认为明文攻击。

4.打开ARCHPR4.53版本(这里强调4.53版本是因为,之前使用4.54版本进行明文攻击时,有时候没有出结果,有时候结果需要非常长的时间才能爆破出来,4.53版本相对来说比较稳定能爆破出结果且时间较短。),选择“打开”,打开待解密的压缩包。

5.选择“攻击类型”为“明文”,点击“明文”选项选择刚才将图片压缩的压缩包。

6.有时候点击开始的时候会出现以下内容,那是因为不同的压缩软件使用的压缩算法不同,后面压缩的那个压缩包需要同题目给的压缩包的压缩算法一直才能进行明文攻击。此时需要更换一个压缩软件进行压缩。(常见压缩软件:好压、winRAR、7z、快压、360压缩)。

7.点击“开始”后就开始进行破解,可得到破解的密钥。

8.点击“确定”,弹出保存解密后的压缩包。

9.成功解密出压缩包并可解压出压缩包内容。

CRC32碰撞

CRC的全称是循环冗余校验,不同长度的常数对应着不同的CRC实现算法,CRC32表示会产生一个32bit(8位十六进制)的校验值。在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容。由于CPU能力,CRC碰撞只能用于压缩文件较小的情况。

举个栗子

1.以bugku的好多压缩包为例,下载题目后将123.rar进行解压,发现压缩包中有68个压缩包。

2.双击压缩包可发现每个压缩包中含有一个大小为4的data.txt文件,猜测可进行CRC32碰撞。

3.编写脚本,尝试使用CRC32碰撞还原出所有压缩包中文件的内容。

#coding:utf-8

import zipfile

import string

import binascii



def CrackCrc(crc):

 for i in dic:

 for j in dic:

 for p in dic:

 for q in dic:

 s = i + j + p + q

 if crc == (binascii.crc32(s) & 0xffffffff):

 #在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff

 #print s

 f.write(s)

 return



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

 #以上3行为获取压缩包CRC32值的步骤

 #print hex(crc)

 CrackCrc(crc)



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

#代表大小写字母+数字+ '+/=



f = open('out.txt', 'w')

CrackZip()

f.close()

4.可得出每个压缩包中TXT的内容。

5.如果文件刚好是6字节,这边推荐一个GitHub上的一个工具,它可以比较快的列出所有可能: 下载地址:https://github.com/theonlypwner/crc32 使用方法: python crc32.py reverse crc32密文(16进制形式)

好了,本次斗哥的压缩包分析就到此结束啦,如果你有关于压缩包更赞的解题思路,记得和斗哥分享哦~

比较会装傻卖萌

比较想你关注我(* ̄∇ ̄*)

原文发布于微信公众号 - 漏斗社区(newdooneSec)

原文发表时间:2019-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券