-
-
[原创]第三题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期)!