BUUCTF Misc Zip
BUUCTF Misc Zip
这道题综合了crc32爆破+base64字节流导入+rar文件格式的知识点
crc32爆破
有68个压缩包,每个都设置了密码,但是文件大小只有四个字节,这时我们联想到crc32爆破,这种方式要求我们加密文件的大小要比较小。
上脚本
#!/usr/bin/python
#python3
import zipfile
import string
import binascii
def CrackCrc(crc):
for i in dic:
for j in dic:
for k in dic:
for h in dic:
s = i + j + k + h
if crc == (binascii.crc32(s.encode())):
f.write(s)
return
def CrackZip():
for i in range(0,68):
file = 'out'+str(i)+'.zip'
crc = zipfile.ZipFile(file,'r').getinfo('data.txt').CRC
CrackCrc(crc)
print('\r'+"loading:{:%}".format(float((i+1)/68)),end='')
dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt','w')
print("\nCRC32begin")
CrackZip()
print("CRC32finished")
f.close()
在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC 结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff 。
我们使用的是python3版本,因此不需要加上&0xffffffff
得到out.txt文件,发现是段base64
z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA==
但是网上的base64解密都不好使,解决方法如下↓
base64字节流写入
base64转换后发现它并不全部落在ASCII范围内,我们要使用字节流方式写入。
import base64
string = "z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA=="
nstr = base64.b64decode(string)
with open("out",'wb') as file: #注意:想要以字节流方式读取、写入,必须模式选择wb 或 rb
file.write(nstr)
RAR文件头
rar ctf wiki 的文档如下
https://wiki.x10sec.org/misc/archive/rar/
我们把rar的文件头列出来
RAR文件头
52 61 72 21 1A 07 00
RAR文件尾
C4 3D 7B 00 40 07 00
补全文件头
打开压缩包即可在描述中找到flag
本博文仅限于博主个人学习和分享使用,请勿用于违法行为。如有侵权,请联系一定删除!