-
-
[原创]第三题wp
-
发表于: 2017-10-29 00:00 2583
-
这题有很多反调试,主要就是过掉反调试,然后直接下断memcmp就可以了。
如何过掉反调试
方法众多,略~
代码分析
直接上IDA伪码。逻辑非常的清晰:
String = 0; j__memset(&v19, 0, 0x3FFu); v16 = 0; j__memset(&v17, 0, 0x3FFu); v20 = GetDlgItemTextA(hDlg, 1001, &String, 1025); v14 = 0; j__memset(&v15, 0, 0x3FFu); sub_D4D267((int)&String, 1024, (int)&v16); v13[0] = 0; j__memset(&v13[1], 0, 0x3FFu); sub_D4D267((int)&v16, 1024, (int)&v14); sub_D4D96A(&v14, (int)v13, 1024); v12 = 3; sub_D4DA78(&v14, 3u, (int)v11); for ( i = 0; i < 32; ++i ) j__sprintf(&v10[2 * i], "%02x", v11[i]); v4 = j__strlen(v10); v5 = &String + j__strlen(&String); v6 = j__strlen(v10); if ( !j__memcmp(v10, &v5[-v6], v4) ) { sub_D4D0B4(); if ( sub_D4D9AB((int)&unk_DBB000, (int)v13) == 1 ) MessageBoxA(0, "ok", "CrackMe", 0); }
其实只要看到memcmp那里就好了
memcmp(encryString,&string + strlen(string) - strlen(encryString),strlen(encryString))
嗯..这个题里会先对输入进行一次处理,然后用一种叫做SM3的算法来进行数据摘要,不要问我怎么知道是这个算法,魔术字7380166F*************,在函数0x00D56700可以看到。这个算法加密出来的摘要是0x40位,所以只要满足key后面0x40位与SM3(en(key))相等即可。
SM3(en(key)) 可以断memcmp就可以得到,当然首先你得过掉反调试~
经测试,输入aaa,和aaaaaaaa,出来的摘要是一样的,说明他应该是只和前几位有关。那就很简单了,直接 string + SM3(en(string)) 就能得出结果。
比如:
SM3(en("aa")) = "432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513"
key = "aa" + "432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513"
验证通过,当然,
aaa432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513
aaaaaaaa432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513
aaaaaaaaab432a34a4946708602bdf52a8b556a3c18ff9ab60c346da83579f149c4f366513
...
也都是可以得,所以这道题违规了,有无限个解。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!