buuctf做题记录
拿到手里是一堆文件:
这里的code是我之后存在这里的一个文件夹,并不是题目给的)
看到了Unity,之前并未做过类似的题目,去查了相关参考:
比较关键的几点是:
- u3d支持c#和js两种脚本,而且c#是最普遍的
- 核心.net代码位于下述路径:
\TPH\TPH_Data\Managed\Assembly-CSharp.dll
3.关于.net
逆向分析
根据以上信息,使用ILSpy打开
hamburger_competition\BJD hamburger competition_Data\Managed
中的Assembly-CSharp.dll
查找关键函数
发现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#的知识,需要学习的东西又增多了。