题目给的两个exe文件die查一下都是64位的
先运行client.exe和service.exe查看逻辑
可以得知简单逻辑:
1. 客户端先把输入用 DES-CBC 加密后发给服务端
2. 服务端收到后先解密,得到明文 serial
3. 服务端再把这个明文 serial 用 AES-CBC 加密
4. 将结果和程序里写死的一段目标密文比较
5. 相同则通过,否则失败
写死的期望值:
FC 8F 2B 91 3A 35 B5 E8 70 EB 18 63 79 F4 CB A0 C4 B0 CC 19 8D 3F A6 39 C5 4E E2 0D 1A 8E 3E 6C 79 16 BD 4C A3 BE 71 4B 95 FC A7 CD 77 73 A2 56两个都拖入ida中,发现import中有加密的
由服务端输出的信息可知,需要找加密的key:
动态调试去找,先给有关Crypt的函数全部设置断点
F9运行
找到AES Key与AES IV:
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad # 配置 AES 解密参数 [cite: 21, 22] k = bytes.fromhex("91adf387c9b48aeed2a19fc7b3d985e4") v = bytes.fromhex("6ec1a237589f03d4b5e70c92fa418b66") # 待处理的十六进制密文 [cite: 23, 24, 25, 26] c_hex = "fc8f2b913a35b5e870eb186379f4cba0c4b0cc198d3fa639c54ee20d1a8e3e6c7916bd4ca3be714b95fca7cd7773a256" c_bytes = bytes.fromhex(c_hex) # 创建解密器并执行解密 [cite: 28] cipher = AES.new(k, AES.MODE_CBC, v) p_bytes = cipher.decrypt(c_bytes) # 移除填充并打印明文结果 [cite: 29, 30] print(unpad(p_bytes, 16).decode())运行结果为:
A1B2C3D4E5F60718293A4B5C6D7E8F90再将结果去client.exe验证一下,结果正确