reverse神奇操作记录
要reverse一个检验验证码的程序,然后验证码一共有十位,但是只能reverse出前九位的计算方法,但是我本地有这个程序,我就疯狂调用这个校验程序直到返回正确之后,再提交给服务器,这好事!!!
#!/usr/bin/env python3
import sys
import subprocess
def generate_serial(username):
if len(username) == 0:
print("Error: Username cannot be empty", file=sys.stderr)
return None
# 字符集
charset = "!$%&/()=?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
charset_len = len(charset) # 0x47 (71)
# 创建序列号数组
serial = [''] * 10
# 第一个字符直接从用户名复制
serial[0] = username[0]
# 计算前9个字符
for i in range(1, 9):
# 如果用户名不够长,使用空字符
current_char = username[i] if i < len(username) else '\0'
# 使用算法计算索引:前一个转换后的字符 + 当前用户名字符,模0x47
index = (ord(serial[i-1]) + ord(current_char)) % charset_len
serial[i] = charset[index]
# 获取前9个字符的序列号前缀
serial_prefix = ''.join(serial[:9])
# 尝试所有可能的最后一个字符
for last_char in charset:
full_serial = serial_prefix + last_char
# 调用magic程序进行验证
try:
result = subprocess.run(
["magic", username, full_serial],
capture_output=True,
text=True
)
# 检查输出是否包含成功消息
if "The Magic Words Are Squeamish Ossifrage" in result.stdout:
return full_serial
except Exception as e:
print(f"Error running magic: {e}", file=sys.stderr)
# 如果没有找到正确的序列号,返回最有可能的一个(以X结尾)
return serial_prefix + 'X'
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <username>", file=sys.stderr)
sys.exit(1)
username = sys.argv[1]
serial = generate_serial(username)
if serial:
# 直接打印序列号,不包含其他输出,以便在shell命令中使用
print(serial)

浙公网安备 33010602011771号