来自云龙湖轮廓分明的月亮 发表于 2023-4-4 14:30:45

强网杯2022 GameMaster

这个题去年把我搞得很惨,比赛就因为它坐牢。恰好这几天又看见了,于是决定一雪前耻,狠狠的复现出来
这个题用dnspy这个软件很容易反编译,拖进去后可以得到
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680175866865-b89d2abe-668e-4262-ba03-006694c11830.png
这个界面,找到main函数,main函数是整个程序最开始执行的地方,下面就是一坨,我们找到最可疑的地方
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680176247875-b65138eb-17af-4aa0-978f-77587a46625a.png
这里的consolekey的意思是接收键盘输入,而escape这个键明显和别的键不一样,它进入了一个函数veifyCode里面,我们跟进去看
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680176354657-f7a5e414-d29e-4e3b-a1aa-9bcb24e2f898.png
可以看见这个函数又调用了一个函数goldFunc,跟进去看看发现又是一坨,但是仔细看就能看见两个不一样的分支
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680177166634-24224c8a-a4d9-4c46-9a70-5c8dbd2414b6.png
这个分支里面有一个key和ECB,ECB是加密模式,再加上有paddingmode.zero这个标准的AES标志,基本可以确定这里用了AES加密
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680177372690-624b8b8d-4f81-43e4-8d34-50482ef9496d.png
这个则使用了一个简单的异或加密,加密方法有了,那么密文是什么呢?
这个时候我们看见了program,点进去
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680177488271-24b07420-8041-4d94-98f0-751923184500.png
可以看见这段代码打开了gamemassage这个文件,然后把这个文件的各个属性都给到了program,由此可知密文即为gamemassage
解密得到一大串文件
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680178138657-8c6b1ffd-dbeb-4a3e-a914-20403888396b.png随便找一个后缀导出,拖进十六进制查看器就可以找到MZ标记,把从MZ标记往后的所有十六进制串dump下来,即可得到新的exe文件
把新的exe文件再次拖进dnspy,就会很清晰的得到加密逻辑
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680178351830-c0e9db10-75c4-416b-b642-a07c826051ee.png
https://cdn.nlark.com/yuque/0/2023/png/28891820/1680178375344-818c0ded-5f0e-44ef-8b5c-3017e74f07e9.png
写脚本解密
from z3 import *

sol = Solver()
xorkey =
cmp = [101, 5, 80, 213, 163, 26, 59, 38, 19, 6, 173, 189, 198, 166, 140, 183, 42, 247, 223, 24, 106, 20, 145, 37, 24, 7,
       22, 191, 110, 179, 227, 5, 62, 9, 13, 17, 65, 22, 37, 5]

x = BitVec('x', 63)
y = BitVec('y', 63)
z = BitVec('z', 63)
dup =

arr =
num = -1
for i in range(320):
    x = (((x >> 29 ^ x >> 28 ^ x >> 25 ^ x >> 23) & 1) | x << 1)
    y = (((y >> 30 ^ y >> 27) & 1) | y << 1)
    z = (((z >> 31 ^ z >> 30 ^ z >> 29 ^ z >> 28 ^ z >> 26 ^ z >> 24) & 1) | z << 1)
    if i % 8 == 0:
      num = num + 1
    arr = ((arr << 1) | (
      ((z >> 32 & 1 & (x >> 30 & 1)) ^ (((z >> 32 & 1) ^ 1) & (y >> 31 & 1))) & 0xffffffff) & 0xff)

for i in range(len(cmp)):
    sol.add(cmp == arr)

assert sol.check() == sat
sol = sol.model()
fake =
Key = * 12
for i in range(3):
    for j in range(4):
      Key = fake >> j * 8 & 255
print(bytearray([(xorkey ^ Key) & 255 for i in range(len(xorkey))]))得到flag
flag{Y0u_@re_G3meM3s7er!}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 强网杯2022 GameMaster