首页
社区
课程
招聘
[原创]BUUCTF逆向题:[BJDCTF2020]BJD hamburger competition
2022-3-27 17:25 5400

[原创]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}


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回