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

补全文件头

image-20200815145837287

打开压缩包即可在描述中找到flag

posted @ 2020-08-15 22:34  LEOGG  阅读(813)  评论(0编辑  收藏  举报