五指山市网站建设_网站建设公司_MongoDB_seo优化
2026/1/18 17:26:04 网站建设 项目流程

冈易云音乐

手玩软件,点开第一首歌,拖动进度条过半会出现登录页面弹窗,已经自动填好用户名 ”jjkk114514“。

image-20260118114505940

结合题目提示,这里的 ”激活码“ 就是 flag。

进入IDA分析,进字符串页面,尝试寻找与 ”用户名“ 或 ”密码“ 有关字符串。

image-20260118114736310

进入 username 所在函数,发现这里是读取 用户名,注册码并进行加密的外层函数。

image-20260118115800899

跟进 sub_426E80

v49[0] = QString::fromAscii_helper("^[a-f0-9]{32}$", 0xE, code);

得知注册码的格式为:32位16进制小写字符串。

image-20260118120813606

image-20260118121034647

由上面几个黑框可以发现,对用户名和注册码加密的核心逻辑是:

  1. 对 username 进行 md5 加密,并将 username 和 加密后的密文 拼接;
  2. 对拼接串进行 SHA256 加密;
  3. 拼接串前16字节记作 x,后16字节记作 y;
  4. 在 sub_401C30(AES的ECB加密,x为密钥,注册码为明文) 中加密;
  5. 将加密结果与 y 比较。

研究发现 sub_401C30 就是 AES 的 ECB 加密(s盒完全一致)。各项参数为:

拼接串为密钥,注册码为明文,v49存的是密文

所以写出如下脚本:

import hashlib
from Crypto.Cipher import AES# 1. 获取username原始字节
username_bytes = b'jjkk114514'# 2. 对username_bytes进行MD5,得到原始字节
md5_bytes = hashlib.md5(username_bytes).digest()# 3. 拼接username_bytes和md5_bytes
combined = username_bytes + md5_bytes# 4. 对拼接结果进行SHA256,得到原始字节
sha256_bytes = hashlib.sha256(combined).digest()# 5. 取前16字节为x,后16字节为y
x = sha256_bytes[:16]  # 16字节密钥
y = sha256_bytes[16:]  # 16字节目标密文# 6. AES-ECB解密,x为密钥,y为密文,得到注册码明文
cipher = AES.new(x, AES.MODE_ECB)
reg_bytes = cipher.decrypt(y)# 7. 转换为32位小写十六进制并输出
reg_code = reg_bytes.hex()
print(reg_code)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询