-
-
[原创]BUUCTF逆向题:[BJDCTF2020]BJD hamburger competition
-
2022-3-27 17:25 5400
-
1.前期信息探查:
1.打开文件:
看到文件的时候我就蒙了,这玩意儿完全没见过,直接就去百度。
百度了一下,发现网上关于这个题的wp基本都是以前没见过开头。
介是一个Unity3D开发的程序,Unity3D是嘛呢:
Unity3D是由Unity Technologies开发的一个让玩家轻松创建互动内容的多平台的综合型游戏开发工具,Unity3D是用C#开发的,c#的反汇编工具为dnspy,但是把哪个东西丢进去呢?
unity在打包玩程序后,会将所有的代码打进一个Assembly-CSharp.dll
的文件里面,通过这个文件的反编译,就能详细看见里面的代码内容。(这个文件在Managed
目录下)
2.运行一下:
是老八的蜜汁小汉堡:
2.dnspy分析:
先把它丢进dnspy
可以看到它调用了蛮多的模块,这里如何快速去定位关键模块呢,这就是游戏题先玩一下游戏的重要性了,玩了游戏就会知道其中的蔬果啥的是可以点击的而这些个玩意儿肯定是通关的关键,知道这点再看这些模块会发现只有ButtoSpawnFruit
模块里有个水果,点击看一下:
可以看到两个加密函数和一个不知道干啥的函数点过去看一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | / / 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); } } |
这里就是check并输出flag的函数,逻辑很清晰:
- Str的sha1值为:"DD01903921EA24941C26A48F2CEC24E0BB0E8CC7"
- Str的Md5值作为flag的核心
找个在线网站:
Str为1001,MD5加密一下
B8C37E33DEFDE51CF91E1E03E51657DA
flag为:flag{B8C37E33DEFDE51CF91E1E03E51657DA}
但是提交后发现不对:
遇事不决还是百度,发现它的md5只返回了前20个字符
这确实有点坑,就没怀疑过两个加密函数,那么最后的flag应为:
flag{B8C37E33DEFDE51CF91E}
赞赏
他的文章
看原图