buuctf做题记录
分析
拿到手里是一堆文件:
(这里的code是我之后存在这里的一个文件夹,并不是题目给的)
看到了Unity,之前并未做过类似的题目,去查了相关参考:
比较关键的几点是:
- u3d支持c#和js两种脚本,而且c#是最普遍的
- 核心.net代码位于下述路径:
\TPH\TPH_Data\Managed\Assembly-CSharp.dll
- 关于.net
逆向分析
根据以上信息,使用ILSpy打开hamburger_competition\BJD hamburger competition_Data\Managed
中的Assembly-CSharp.dll
ILSpy的安装
然后点击左上角的File
之后save code
,选择一个空文件夹保存反编译后的代码(我这里就是新建了一个code文件夹)
在得到的一堆文件中,用VS
打开这个文件
.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。
可以看到反编译后的代码了:
之前尝试点击过这个游戏,游戏界面是这样的:
显然,ButtonSpawnFruit.cs
里的字符串与显示的界面有关,很有可能藏有flag,继续往下看:
显而易见的一个SHA1和一个md5,首先进行SHA1解密:
得到1001
再进行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#的知识,需要学习的东西又增多了。