最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球微动态丨强网杯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 = -1for 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() == satsol = sol.model()fake = [sol.eval(i).as_long() & 0xffffffff for i in dup]Key = [0] * 12for i in range(3):    for j in range(4):        Key[i * 4 + j] = fake[i] >> j * 8 & 255print(bytearray([(xorkey[i] ^ Key[i % len(Key)]) & 255 for i in range(len(xorkey))]))

得到flag

flag{Y0u_@re_G3meM3s7er!}

关键词: