[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文件
注意下面的{}目录才是真正作者代码的目录
注意查看{}目录下的文件,在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}
正确