NSSCTF强网杯GameMaster

img
题目如上,压缩包打开之后有三个文件
img
可以看到有一个程序,还有一个message文件,剩下一个dll文件,dll文件放在最后再考虑是否分析,除非是unity的主函数dll(因为那种dll属于程序的主要代码在里面)
扫描一下文件看看成分:
img
32位程序,并且是c#编写的,调用的还是net文件,使用dnspy打开看看(c#编写的程序很多情况都是使用dnspy进行分析)
img
打开之后,其中的文件夹结构和其中的主函数和自定义函数都明了了,并且其名字也没有说进行混乱处理。基本一眼就知道函数主要作用是什么。
先看主函数:
img
要看的话也不难,关键的地方也就几个地方就知道这个程序大致是什么样子了。嫌弃麻烦或者说图速度更快的话也可以丢给ai分析。

FileStream fileStream = File.OpenRead("gamemessage");
#读取了gamemessage文件内容
int num = (int)fileStream.Length;
Program.memory = new byte[num];
fileStream.Position = 0L;
fileStream.Read(Program.memory, 0, num);
#这地方的主要逻辑就是获取message文件的长度,给memory开辟空间,最后把message文件内容存入memory中

然后再下面代码内容意思就是获取键盘的输入然后执行对应的功能,感兴趣可以看看。
img
看到这里,可以看到这里的函数verifyCode,英语不比我差的应该是可以看得出来这个函数是干什么得,要到达这个函数就是在你得到一定金额之后摁esc然后就会开始检测你目前的钱的信息。
img
这里可以看到它对数值和字符没做什么特殊处理,就是拼接在一起,然后进入下面的函数。进入下面的函数继续分析。

下面函数里面的大多数都没必要分析,就是对游戏中的赌注和金额进行修改什么的,看到一些比较关键的地方:
img
img
这两个地方一个对内存里面的内容作了异或操作,一个对内存里面的数据做了解密操作。从下面有个ECB的字眼,可以看得到这是进行了aes的ECB模式解密。
img
这是往内存里面的内容引入了一些未知值。暂时先放一边,我们知道内存里面的内容是message文件的内容,于是我们把gamemessage文件放入cyberchef进行解密。
img先先把aes的key输出。
img
从这里也可以知道,虽然是ECB模式,但是padding模式是zero,然后输入进去的iv也是0,所以这这两个是不用填入的。
img
用文件检测告诉我是字体文件,但是就是稍微想想就知道,如果是字体文件那为什么游戏的信息在里面并且被加密了呢。
所以把文件里面的数据交给ai分析一下。
并且这个文件的文件头也属于一种未知的状态。
img
img
问了两遍最后问到了关键信息,有MZ文件头的地方。那么将其文件保存之后用010打开然后删除MZ字符之前的所有内容。
img
并且将文件保存卫exe(MZ是exe程序的文件头)
img
扫描发现还是C#程序,用dnspy打开看看。
img
找到之后发现它的名字是ExploitClass,然后去左边打开ExploitClass的那一栏进行分析。
img
总共三个函数。可以看到T1是主要的,然后使用另外两个函数在主要的T1里面。
img
从下面的flag处网上分析,可以知道上面进行的是flag解密,根据流程一步步解密的话就可以得知只要复现这个流程,然后未知的部分使用z3求解器进行求解然后就可以得到flag了。

关键函数:
img
img
然后还有最后的异或操作:
img
最终可以得得exp如下:

from z3 import *
num=-1
x=BitVec('x',64)
y=BitVec('y',64)
z=BitVec('z',64)
s=Solver()
keystr=[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]
arr = [BitVec("arr[%d]"%i,64) for i in range(len(keystr))]
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)
for i in range(len(keystr)):
    s.add(keystr[i]==arr[i])
if s.check() == sat:
    model=s.model()
    #print(model)
x = 156324965
y = 868387187
z = 3131229747
arr4=[x,y,z]
key=[0]*12
for i in range(3):
    for j in range(4):
        key[i*4+j]=arr4[i]>>j*8&255

arr5=[60,
						100,
						36,
						86,
						51,
						251,
						167,
						108,
						116,
						245,
						207,
						223,
						40,
						103,
						34,
						62,
						22,
						251,
						227]

for i in range(len(arr5)):
    arr5[i]^=key[i%len(key)]

print("flag{",end="")
for i in arr5:
    print(chr(i),end='')
print("}")
#flag{Y0u_@re_G3meM3s7er!}
posted @ 2025-09-10 20:16  喵老师哒哟  阅读(26)  评论(0)    收藏  举报