附件链接:https://wwvc.lanzouj.com/iIqq218z5x0d
给了一个pyc文件
利用命令将pyc转换为py文件
uncompyle6 ezPython.pyc > ezPython.py
打开py文件
# uncompyle6 version 3.9.0
# Python bytecode version base 3.7.0 (3394)
# Decompiled from: Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: .\ezPython.py
# Compiled at: 2022-09-03 23:53:44
# Size of source mod 2**32: 444 bytes
from Crypto.Util.number import *
import base64, base58
password = open('password.txt', 'r').read()
tmp = bytes_to_long(password.encode('utf-8'))
ans = base64.b64encode(base58.b58encode(str(tmp))).decode()
print("I've forgot my password,could you please help me find the password?")
if ans == 'M0hBajFITHVLcWV6R1BOcEM5MTR0R0J3eGZVODV6MTJjZUhGZFNHQw==':
print('You get the password!')
else:
print('Wrong! try again')
# okay decompiling ezPython.pyc
这段代码是Python中的字符串和编码转换操作。
首先,password是一个字符串,使用encode()方法
将其转换为字节类型(bytes),采用UTF-8编码方式进行转换。接下来,tmp使用bytes_to_long函数
将字节序列转换为一个长整型数值。
然后,tmp的值通过先使用Base58编码,再使用Base64编码的方式进行转换。base58.b58encode()和base64.b64encode()分别是对应的编码函数。
最后,使用decode()方法将编码后的结果转换为字符串类型。使加密后的值也就是ans等于M0hBajFITHVLcWV6R1BOcEM5MTR0R0J3eGZVODV6MTJjZUhGZFNHQw==
整个过程就是将密码转换为经过Base58编码和Base64编码的字符串,以ans变量保存结果。
解码过程:
先将ans进行base64解密,再进行base58解密
3HAj1HLuKqezGPNpC914tGBwxfU85z12ceHFdSGC
22385992650816784030032474165
再用python跑出bytes字节类型转换为长整型数值
from Crypto.Util.number import *
import base64, base58
password = '22385992650816784030032474165'
tmp = long_to_bytes(password.encode('utf-8'))
print(tmp)
# b'HUBUCTF@1405'
password为HUBUCTF@1405
根据题目描述,flag为md5(password),一般取md5加密都是32位小写
故flag:NSSCTF{fd78ee3399dd6a3c1d0b637fdca0c075}