在我的网络安全实验室中,我必须编写一个python程序来遍历一个.txt密码文件和一个.txt用户名文件,并将它们与Login.pyc文件(以作为参数)进行比较,如果匹配正确,则返回“Login successful.”。
我尝试使用subprocess模块在命令行上运行python3 Login.pyc <user> <password>
,密码文件中有100,000个密码,因此显然花费了非常长的时间。
import subprocess
if __name__ == "__main__":
gang = open("gang") #usernames .txt file (20 lines)
pws = open("PwnedPWs100k") #passwords .txt file (100,000 lines)
for name in gang:
print("USER = ", name)
for item in pws:
output = subprocess.run(["python3", "Login.pyc", "{}".format(name.rstrip()), "{}".format(item.rstrip())], capture_output=True, text=True).stdout.strip("\n")
if output == 'Login successful.':
print("USER:" + name + "PASSWORD:" +item)
break
pws.close()
gang.close()
UPDATE:我现在从Login.pyc导入Login()函数,因为它使用命令行参数,所以我在嵌套循环中更新sys.argv变量,并将它们传递给Login()函数,但是这与我以前的方法花费的时间类似。
if __name__ == "__main__":
with open("gang") as gang:
with open("PwnedPWs100k") as pws:
sys.argv = [sys.argv[0], 1, 2]
for name in gang:
sys.argv[1] = name.rstrip()
for item in pws:
sys.argv[2] = item.rstrip()
while not Login.Login():
continue
else:
print("USER:" + name + "PASSWORD:" +item)
break
'''
Any ideas on optimizing the runtime?
1条答案
按热度按时间q3aa05251#
Subprocess和multiprocessing是很好的模块,但它们似乎不是完成这项工作的合适工具。
启动一个新的python解释器和做一些导入和函数定义的开销会让你很难受,不需要做超过几次。
我不能简单地导入Login()函数,因为它是加密的。
我拒绝这个前提。两次。
当你说“加密”时,我相信你的意思是源文本已经被编译成字节码。这不是一个障碍。
只需要
import Login
,然后用dir(Login)
(甚至help(Login)
)四处看看。我打赌像check_password
这样的函数会跳出来。调用它。200万次。在同一个过程中。此外,
dis.dis()
也是可用的。因此,您可以看到“if name is main:“保护程序运行了什么,也可以看到check_password
中发生了什么。它为您提供了足够的信息,让您编写自己的源代码来执行相同的检查。我敢肯定,这正是您的教授希望您最终获得的见解。https://docs.python.org/3/library/dis.html
顺便说一句,现在谁会写像
gang.close()
这样的东西呢?已经使用with open...
上下文管理器了。支持
import
和类似操作的库不止一个,看看pypi,它有一个完整的生态系统,包括标准的importlib,致力于理解二进制字节码工件。请注意,在生成和使用.pyc文件时,可能需要使用相同的python解释器版本,但尝试的数量有限:3.8,3.9,还有一些,不会太久的。
也许第一次不会完全顺利。别担心。像一个攻击者一样思考。你是木槌。
构造一些与想象中的Login.py * 相似 * 的源代码。将其转换为.pyc字节码。* 假装 * 看不到源代码。利用字节码。
如果你不太喜欢,调整一下源,产生另一个。pyc,泡沫,重复,直到你可以自信地通过这些沃茨航行。