解题领红包之四 {Windows 初级题}
概述
本指南解释了如何通过分析 Python 字节码从 crackme 挑战中提取密码。
步骤 1:提取可执行文件
使用 https://github.com/zrax/pycdc 工具将程序提取到 crackMe_py.exe_extracted\ 目录,其中包含 Python 字节码文件。
步骤 2:查找加密的标志
在提取的字节码文件 crackme_easy.pyc 中搜索加密数据,查找类似 base64 的模式:
import re
with open('crackMe_py.exe_extracted/crackme_easy.pyc', 'rb') as f:
data = f.read()
# 搜索 base64 模式
b64_patterns = re.findall(rb'[A-Za-z0-9+/]{20,}={0,2}', data)
找到:e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O
步骤 3:解码 Base64
加密的标志是 base64 编码的。对其进行解码:
import base64
encrypted_flag = "e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O"
flag_bytes = base64.b64decode(encrypted_flag)
# 结果:b'{|>~$o}m|~|xd\x06z>>7c\x00}9c\x17}z<\x0e\x0e\x0e'
步骤 4:尝试 XOR 解密
由于挑战提示了 "XOR"(找到了类似 xor_decrypt 的函数名),尝试使用不同的密钥进行 XOR 解密:
# 尝试所有单字节 XOR 密钥(0-255)
for key in range(256):
decrypted = bytes([b ^ key for b in flag_bytes])
# 检查结果是否都是可打印的 ASCII 字符
if all(32 <= b <= 126 for b in decrypted):
print(f"密钥 {key}: {decrypted.decode('utf-8')}")
步骤 5:找到正确的密钥
只有 密钥 78(0x4E)产生包含有意义文本的可打印输出:
密钥 78: 52p0j!3#2026*H4ppy-N3w-Y34r@@@
这个字符串包含可识别的模式:
52(来自 "52pojie")
2026(来自年份)
H4ppy(看起来像 "Happy")
N3w(看起来像 "New")
Y34r(看起来像 "Year")
步骤 6:验证密码
为了确认这是正确的,用相同的密钥将其加密回去:
password = "52p0j!3#2026*H4ppy-N3w-Y34r@@@"
key = 78
# 加密
encrypted = bytes([ord(c) ^ key for c in password])
# 应该匹配原始的加密标志
print(encrypted == flag_bytes) # True
完整的 Python 脚本
这是提取和验证密码的完整脚本:
import base64
import re
# 读取字节码文件
with open('crackMe_py.exe_extracted/crackme_easy.pyc', 'rb') as f:
data = f.read()
# 查找 base64 模式
b64_patterns = re.findall(rb'[A-Za-z0-9+/]{20,}={0,2}', data)
print("找到的 base64 模式:", b64_patterns)
# 加密的标志
encrypted_flag = "e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O"
# 解码 base64
flag_bytes = base64.b64decode(encrypted_flag)
print(f"\n加密的标志(十六进制):{flag_bytes.hex()}")
print(f"长度:{len(flag_bytes)} 字节")
# 尝试所有单字节 XOR 密钥
print("\n尝试使用所有密钥进行 XOR 解密:")
for key in range(256):
decrypted = bytes([b ^ key for b in flag_bytes])
if all(32 <= b <= 126 for b in decrypted):
decrypted_str = decrypted.decode('utf-8')
# 检查是否包含有意义的单词
if any(word in decrypted_str.lower() for word in ['pojie', 'happy', '2026', 'flag']):
print(f"密钥 {key:3d}: {decrypted_str}")
# 验证正确的密码
password = "52p0j!3#2026*H4ppy-N3w-Y34r@@@"
key = 78
encrypted = bytes([ord(c) ^ key for c in password])
print(f"\n验证:{encrypted == flag_bytes}")
总结
密码 *52p0j!3#2026H4ppy-N3w-Y34r@@@** 通过以下方式获得:
- 在字节码中找到 base64 编码的加密标志:
e3w+fiRvfW18fnx4ZAZ6Pj43YwB9OWMXfXo8Dg4O
- 从 base64 解码得到:
b'{|>~$o}m|~|xd\x06z>>7c\x00}9c\x17}z<\x0e\x0e\x0e'
- 使用密钥 78 进行 XOR 解密得到:
52p0j!3#2026*H4ppy-N3w-Y34r@@@