buu练题记录2
这个题比较有意思,内部的代码比较简单,但是包装在一个Unity3D游戏中。
关于Unity逆向看这里:Unity游戏逆向及破解方法介绍
0x00分析
所以就找对文件就OK了,这里我们找到Managed文件夹下的Assembly-CSharp.dll文件。这里我们需要用反编译和分析dll代码的工具:ILSpy或者dnSpy(这里我是用dnspy)
在函数ButtonSpawnFruit中发现端倪:
可以看到flag就藏在str里面,将DD01903921EA24941C26A48F2CEC24E0BB0E8CC7通过sha1解码得:1001。再将1001 进行MD5加密:
可以看到这里总共有4种结果。再仔细看看代码,就可以找到:
可以看到这里有两个很重要的点:
- ToString(“X2”):括号里面的大写的X表示结果取大写,同理若是x则是小写;
- Substring(0,20):只取0到19(既前20位)
所以构建出flag为BJDCTF{B8C37E33DEFDE51CF91E}。由于是buu平台所以是flag{B8C37E33DEFDE51CF91E}
0x01总结
个人习惯在做题是用txt保留记录,整理一下就是基本思路:
0x02插曲
在看到源码之后我最开始想尝试能不能通过直接玩游戏玩出来,但是然后写了一个爆破的exp
def humburger(Init,i):
if i == 1:
Init += 997
elif i == 2:
Init -= 127
elif i == 3:
Init *= 3
elif i == 4:
Init ^= 18
elif i == 5:
Init += 29
elif i == 6:
Init -= 47
elif i == 7:
Init *= 5
elif i == 8:
Init ^= 87
elif i == 9:
Init ^= 127
return Init
for j in range(111111,200000):
Init = 0
chu = 100000
for k in range(5):
step = int(j/chu)%10
Init = humburger(Init,step)
chu = int(chu/10)
if Init == 1001:
print(j)
if j == 123459 or j == 134579:
print(Init)
然而并没有跑出来,这出题人也太狗了,打他~