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)
posted @ 2025-03-25 09:50  peterzh6  阅读(2)  评论(0)    收藏  举报