强网杯[GameMaster]

分析

首先查壳,C#,NET的,直接放入ILSpy去分析

image-20220804161945177

然后去goldfunc函数中找到加密信息,这里是第一个加密

image-20220804162709634

第二个加密看见了key为16位,然后ECB,就想到了AES-ECB

image-20220804162757941

然后去破解

image-20220804163115941

这里的Brainstorming!!!就是key的ASCII码,解出来之后将它保存成EXE文件,转成之后要去掉前面多余部分一直到MZ(是exe文件的标志)

image-20220804163536414

改成这样保存即可,然后再一次放入ILSpy

image-20220804163623984

这里有两个加密函数,一个是Check1另一个是ParseKey,看到最后一个for循环,可以知道要得到flag就是要用array4^array5,array5已知,求array4用到ParseKey函数,但是不知道array的值,就要用到Chek1函数,看到if (first.SequenceEqual(array2))就能知道first的值就是array2的值,然后进去Check1函数

image-20220804170229995

很容易知道是用z3求解,求出array之后去看一下ParseKey函数

image-20220804170338095

逻辑很清楚了,直接写脚本

脚本

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]
num = -1
arr = [BitVecVal(0, 63) for i in range(len(cmp))]
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 += 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{Y0u_@re_G3meM3s7er!}

总结

了解到了AES-ECB和CBC等这一系列高级加密和一些工具的使用,tql