下载附件

应用程序是一个有味道的游戏(属于untiy3D游戏),判断和逆向这类游戏参考此链接。
分析
? ? ? ? 首先查看信息,无壳64位。再下载dnSpy-net,下载地址。

? ? ? ? ?打开dnSpy,找到BJD hamburger competition_Data\Managed目录下Assembly-CSharp.dll文件打开。
????????之所以要打开这个文件是因为unity在打包后,会将所有的代码打进一个Assembly-CSharp.dll的文件里面,通过这个文件的反编译,就能详细看见里面的代码内容。
? ? ? ? 找到与食物有关的模块,

见代码
// ButtonSpawnFruit
// Token: 0x0600000C RID: 12 RVA: 0x000021C8 File Offset: 0x000003C8
public void Spawn()
{
FruitSpawner component = GameObject.FindWithTag("GameController").GetComponent<FruitSpawner>();
if (component)
{
if (this.audioSources.Length != 0)
{
this.audioSources[Random.Range(0, this.audioSources.Length)].Play();
}
component.Spawn(this.toSpawn);
string name = this.toSpawn.name;
if (name == "汉堡底" && Init.spawnCount == 0)
{
Init.secret += 997;
}
else if (name == "鸭屁股")
{
Init.secret -= 127;
}
else if (name == "胡罗贝")
{
Init.secret *= 3;
}
else if (name == "臭豆腐")
{
Init.secret ^= 18;
}
else if (name == "俘虏")
{
Init.secret += 29;
}
else if (name == "白拆")
{
Init.secret -= 47;
}
else if (name == "美汁汁")
{
Init.secret *= 5;
}
else if (name == "柠檬")
{
Init.secret ^= 87;
}
else if (name == "汉堡顶" && Init.spawnCount == 5)
{
Init.secret ^= 127;
string str = Init.secret.ToString();
if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7")
{
this.result = "BJDCTF{" + ButtonSpawnFruit.Md5(str) + "}";
Debug.Log(this.result);
}
}
Init.spawnCount++;
Debug.Log(Init.secret);
Debug.Log(Init.spawnCount);
}
}
? ?可以看到是先将str进行sha1加密得字符串
"DD01903921EA24941C26A48F2CEC24E0BB0E8CC7"
所以先进行sha1解密,sha1解密在线网站。得到

跟进MD5函数
?
public static string Md5(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
byte[] array = MD5.Create().ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte b in array)
{
stringBuilder.Append(b.ToString("X2"));
}
return stringBuilder.ToString().Substring(0, 20);
}
再将得到结果进行MD5加密,MD5在线加密网站。

再分析MD5函数
.ToString("X2")是将字符串改为大写。
?.Substring(0, 20)是取父字符串的前20位。

?
?操作后得到flag{B8C37E33DEFDE51CF91E}
?
|