原创

: 递归解压zip文件

递归解压zip文件

此代码解决的问题是 套娃

某一题CTF就是把一个文本文件压缩了几百次,套在几百个zip文件里面。几乎不能想象。
在此处,还没有想到问题的 严重性。
在这里插入图片描述
已知,解压的密码就是上一个zip的文件名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
import zipfile

dir = "C:\\Users\\brighten\\Desktop\\ff\\"

n = 0
s2 = ""


def jieya():
i = "0653.zip"
for x in range(10000):
ss = i[:i.find(".")]
print(i)
zpf = zipfile.ZipFile(dir + ss + ".zip")
list = zpf.namelist() # 得到压缩包里所有文件
for f in list:
zpf.extract(f, dir, ss.encode('utf-8')) # 循环解压文件到指定目录,密码
print(ss + "解压成功" + str(f))
i = str(f)

#这里注释掉的代码是一个字典,记录重复的文件名,没有用
'''t = {}
for i in range(10000):
s = str(i)
while len(s) < 4:
s = '0' + s
t[s] = False'''

jieya()



这里写代码的时候有一个误区,就是以为他的文件名是不重复的,就去设置了一个字典。

但是后来发现,这样的结果是最后会停止执行,而且的确程序是正常执行的。

原因就是文件名有重复的,后解压的文件会有一部分文件名和原有文件名相同。就是自己加条件的问题,值得反思。

这个问题主要的点在于编写程序。
但是每一个解压,会有一个新的文件出现在dir目录下。
本来的想法是直接硬来,把全部的文件重新解压,但是这样的复杂度就挺高的,还可能会有一些错误。

最后的解决方法是类似一个斐波那契数列的思想。

把解出来的压缩包名称传递给一个变量i

对i再解压。

在这里插入图片描述
最后是得到了一个文本文件,里面是三联组的像素表示。

在这里插入图片描述
目测是200*200的二维码

这个作图还是很简单的,基础图像处理

做图

单单是做这样一张图,用这种偷懒的方法就可以了

但是还是最好做成RGB的图,这样的程序的使用频率要高一点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import cv2 as cv
I=np.zeros((200,200),dtype=np.uint8)


with open(r'C:/Users/brighten/Desktop/qr.txt', 'r') as f:
count=0
for line in f:
print(line)
print(line[1:4])
if str(line[1:4])=='255':
I[count//200][count%200]=255
else:
I[count // 200][count % 200] = 0
count+=1
cv.imwrite("1.png",I)
print(I)

在这里插入图片描述
最后是得到了这个二维码,200*200的大小