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

[原创]第三题wp

2017-10-29 00:00
2197
 

这题有很多反调试,主要就是过掉反调试,然后直接下断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
...
也都是可以得,所以这道题违规了,有无限个解。


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

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