强网杯2022 GameMaster
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强网杯2022 GameMaster相关的知识,希望对你有一定的参考价值。
这个题去年把我搞得很惨,比赛就因为它坐牢。恰好这几天又看见了,于是决定一雪前耻,狠狠的复现出来
这个题用dnspy这个软件很容易反编译,拖进去后可以得到
这个界面,找到main函数,main函数是整个程序最开始执行的地方,下面就是一坨,我们找到最可疑的地方
这里的consolekey的意思是接收键盘输入,而escape这个键明显和别的键不一样,它进入了一个函数veifyCode里面,我们跟进去看
可以看见这个函数又调用了一个函数goldFunc,跟进去看看发现又是一坨,但是仔细看就能看见两个不一样的分支
这个分支里面有一个key和ECB,ECB是加密模式,再加上有paddingmode.zero这个标准的AES标志,基本可以确定这里用了AES加密
这个则使用了一个简单的异或加密,加密方法有了,那么密文是什么呢?
这个时候我们看见了program,点进去
可以看见这段代码打开了gamemassage这个文件,然后把这个文件的各个属性都给到了program,由此可知密文即为gamemassage
解密得到一大串文件
随便找一个后缀导出,拖进十六进制查看器就可以找到MZ标记,把从MZ标记往后的所有十六进制串dump下来,即可得到新的exe文件
把新的exe文件再次拖进dnspy,就会很清晰的得到加密逻辑
写脚本解密
from z3 import *
sol = Solver()
xorkey = [60, 100, 36, 86, 51, 251, 167, 108, 116, 245, 207, 223, 40, 103, 34, 62, 22, 251, 227]
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 = [x, y, z]
arr = [BitVecVal(0, 63) for i in range(len(cmp))]
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[num] = ((arr[num] << 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[i] == arr[i])
assert sol.check() == sat
sol = sol.model()
fake = [sol.eval(i).as_long() & 0xffffffff for i in dup]
Key = [0] * 12
for i in range(3):
for j in range(4):
Key[i * 4 + j] = fake[i] >> j * 8 & 255
print(bytearray([(xorkey[i] ^ Key[i % len(Key)]) & 255 for i in range(len(xorkey))]))
得到flag
flagY0u_@re_G3meM3s7er!
以上是关于强网杯2022 GameMaster的主要内容,如果未能解决你的问题,请参考以下文章