如何使用Python通过bruteforcing提取.zip文件
我得到了一个使用python解决的问题,该问题说明: 我们已经开始组织这些文件,试图理解它们,但它们都被一个三位数的数字密码锁定 看看您是否可以编写一个脚本,进入这个示例文件如何使用Python通过bruteforcing提取.zip文件,python,python-3.x,file,zip,Python,Python 3.x,File,Zip,我得到了一个使用python解决的问题,该问题说明: 我们已经开始组织这些文件,试图理解它们,但它们都被一个三位数的数字密码锁定 看看您是否可以编写一个脚本,进入这个示例文件alien-zip-2092.zip,并读取我们认为其中的文本文件,无论zip是什么(因此在本例中alien-zip-2092.txt) 文件应解压缩到/tmp/目录 我的代码只做了这么多。它获取zip文件,并使用0-999中的所有数字将其提取出来,但每次运行代码时,结果都是999。无法检查文件夹是否已正确提取,因此我添加了
alien-zip-2092.zip
,并读取我们认为其中的文本文件,无论zip是什么(因此在本例中alien-zip-2092.txt
)
文件应解压缩到/tmp/
目录
我的代码只做了这么多。它获取zip文件,并使用0-999中的所有数字将其提取出来,但每次运行代码时,结果都是999
。无法检查文件夹是否已正确提取,因此我添加了Print(password)
进行检查
这是我的密码:
import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
try:
zf.extract(member="/tmp", pwd = str(i).encode()
password = 'Password found: %s' % password
except:
pass
print(password)
似乎我的程序正在用一个同名的空白文件覆盖正确的文件,因为它在提取文件后没有中断循环,但我可能错了
打印出txt文件的内容是一个好主意,它应该在压缩文件夹中,但是如果没有其他代码的工作,这是不可能做到的
为什么不打印正确的密码?有人有其他想法来解决这个主要问题吗?您将存储“Password found”消息的变量命名为与
for
循环的迭代变量相同的变量,因此下一次迭代一开始,它就会覆盖存储的消息
相反,您应该打印正确的密码,并在找到循环后立即中断循环,并使用else
块处理for
循环未找到正确密码的情况,如果循环结束时未中断密码,则会发生这种情况:
import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
try:
zf.extract(member="/tmp", pwd = str(i).encode())
print('Password found: %s' % password)
break
except:
pass
else:
print('No valid password found.')
一些建议:
- 不要覆盖变量
密码
,它是循环变量。另外,i
似乎没有定义,因此您可能需要更改它
- 我建议使用前导零格式化小数值,以符合问题陈述(可能使用
'{:03d}.format()
)
- 使用空白除了不是一个好主意,因为它可能隐藏可能发生的其他错误
- 我建议在
.extract()中使用或至少指定正确的成员
和路径
以下是代码的修改版本:
import zipfile
filename = 'alien-zip-2092'
zf = zipfile.ZipFile('{}.zip'.format(filename))
password = None
for i in range(1000):
try:
temp_password = '{:03d}'.format(i)
zf.extract(
member='{}.txt'.format(filename),
path='/tmp/',
pwd=temp_password.encode())
# extraction was successful
password = temp_password
break # exit the for loop
except zipfile.BadZipFile as err:
# print(err)
pass
if password is None:
print('No valid password found.')
else:
print('Password found: {}'.format(password))