[BJDCTF2020]BJD hamburger competition-buuctf

2023-12-28 17:30:14

buuctf做题记录

拿到手里是一堆文件:

这里的code是我之后存在这里的一个文件夹,并不是题目给的)
看到了Unity,之前并未做过类似的题目,去查了相关参考
比较关键的几点是:

  1. u3d支持c#和js两种脚本,而且c#是最普遍的
  2. 核心.net代码位于下述路径:
\TPH\TPH_Data\Managed\Assembly-CSharp.dll

3.关于.net

逆向分析

根据以上信息,使用ILSpy打开hamburger_competition\BJD hamburger competition_Data\Managed中的Assembly-CSharp.dll

ILSpy的安装

查找关键函数

发现ButtonSpawnFruit中使用了Md5和SHA函数
关键代码:

// 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);
	}
}

使用SHA1在线加解密网站解密字符串得到str

使用MD5在线加密str得到

b8c37e33defde51cf91e1e03e51657da

分析md5函数

// ButtonSpawnFruit
// Token: 0x0600000A RID: 10 RVA: 0x00002110 File Offset: 0x00000310
public static string Md5(string str)
{
	byte[] bytes = Encoding.UTF8.GetBytes(str); //UTF-8编码
	byte[] array = MD5.Create().ComputeHash(bytes);
	StringBuilder stringBuilder = new StringBuilder();
	foreach (byte b in array)
	{
		stringBuilder.Append(b.ToString("X2")); // ToString("X2") 为C#中的字符串格式控制符,X为十六进制(X的大小写控制十六进制数的大小写) 2为每次都是两位数
	}
	return stringBuilder.ToString().Substring(0, 20);//取前20位
}

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

之前尝试点击过这个游戏,游戏界面是这样的:

显然,ButtonSpawnFruit.cs里的字符串与显示的界面有关,很有可能藏有flag,继续往下看:

再进行md5加密

可是把32位和16位的结果都包上flag{}交上去了却都不对,找了一个把小写字母转换成大写字母的网站,提交大写字母的flag仍旧不对,于是思考,在SHA1已经解密出1001的情况下,出错的应该是md5的加密,返回去看具体的md5加密函数:

虽然我没学过c#,但substring应该是比较常见的名称了,它把md5得到的字符串截取了0-20的部分,所以flag只有20个字符,到这里我就大小字母都试了试交了flag,之后又去搜了下ToString("X2")

ToString(“X2”) 为C#中的字符串格式控制符X为 十六进制 2为 每次都是两位数比如 0x0A ,若没有2,就只会输出0xA 假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。
(由此知是大写的字母)

最后得到flag:
在这里插入图片描述

小结

更新了对.net、unity3D以及C#的知识,需要学习的东西又增多了。

文章来源:https://blog.csdn.net/m0_52484587/article/details/135270917
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。