如何使用Python通过bruteforcing提取.zip文件

如何使用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。无法检查文件夹是否已正确提取,因此我添加了

我得到了一个使用python解决的问题,该问题说明:

我们已经开始组织这些文件,试图理解它们,但它们都被一个三位数的数字密码锁定

看看您是否可以编写一个脚本,进入这个示例文件
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))