首页
社区
课程
招聘
[原创]第三题wp
发表于: 2017-10-29 00:00 2660

[原创]第三题wp

2017-10-29 00:00
2660
 

这题有很多反调试,主要就是过掉反调试,然后直接下断memcmp就可以了。

如何过掉反调试

方法众多,略~

代码分析

直接上IDA伪码。逻辑非常的清晰:

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
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那里就好了

1
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
...
也都是可以得,所以这道题违规了,有无限个解。


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册