[BJDCTF2020]BJD hamburger competition

下载附件

[BJDCTF2020]BJD hamburger competition

应用程序是一个有味道的游戏(属于untiy3D游戏),判断和逆向这类游戏参考此链接

分析

        首先查看信息,无壳64位。再下载dnSpy-net,下载地址

[BJDCTF2020]BJD hamburger competition

         打开dnSpy,找到BJD hamburger competition_Data\Managed目录下Assembly-CSharp.dll文件打开。

        之所以要打开这个文件是因为unity在打包后,会将所有的代码打进一个Assembly-CSharp.dll的文件里面,通过这个文件的反编译,就能详细看见里面的代码内容。

        找到与食物有关的模块,

[BJDCTF2020]BJD hamburger competition

见代码

// 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解密在线网站。得到

[BJDCTF2020]BJD hamburger competition

跟进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在线加密网站

[BJDCTF2020]BJD hamburger competition

再分析MD5函数

.ToString("X2")是将字符串改为大写。

 .Substring(0, 20)是取父字符串的前20位。

[BJDCTF2020]BJD hamburger competition

 [BJDCTF2020]BJD hamburger competition

 操作后得到flag{B8C37E33DEFDE51CF91E}

 

上一篇:机器学习 —— 基础整理(六)线性判别函数:感知器、松弛算法、Ho-Kashyap算法


下一篇:python极简教程08:对象的方法