[BJDCTF2020]hamburgercompetition题解

基本面分析

这是个unity程序,参考博客:https://www.52pojie.cn/thread-495115-1-1.html
  • 主程序文件在:.\BJD hamburger competition_Data\Managed\Assembly-CSharp.dll
  • 需要使用net反汇编软件能更好的反汇编,使用经典的 dnSpy反编译工具(IDA也可以不过难理解不少)

代码分析

使用dnSpy打开Assembly-CSharp.dll文件

注意下面的{}目录才是真正作者代码的目录

Snipaste_2021-02-23_15-31-29.png

注意查看{}目录下的文件,在ButtonSpawnFruit文件下面有可疑字符串

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

可以看出flag就是str进行md5的结果,而str进行sha1的结果DD01903921EA24941C26A48F2CEC24E0BB0E8CC7

解题

  • sha1解码DD01903921EA24941C26A48F2CEC24E0BB0E8CC7后得到1001
  • 在将1001进行md5加密得到B8C37E33DEFDE51CF91E1E03E51657DA包裹flag{}提交后错误

检查了一下Md5的代码内容,发现结果取20个字符

Substring是截取子字符串,左闭右开
    public static string Md5(string str)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(str);
        byte[] array = MD5.Create().ComputeHash(bytes);
        StringBuilder stringBuilder = new StringBuilder();
        foreach (byte b in array)
        {
            stringBuilder.Append(b.ToString("X2"));
        }
        return stringBuilder.ToString().Substring(0, 20);
    }

修改后

  • flag{B8C37E33DEFDE51CF91E}

正确

Last modification:February 23, 2021
如果觉得我的文章对你有用,请随意赞赏。咖啡(12RMB)进度+100%,一块巧克力(1RMB)进度+6%。
(赞赏请备注你的名称哦!后台记录中来自理工小菜狗)