-
-
[原创]看雪CTF2017秋季赛-第三题writeup
-
发表于: 2017-10-28 18:35 2339
-
首先拿到题目运行一下,可以看出这是一个windows窗口程序
拖到IDA中,查找WinMain 找到对话框的消息函数
1 2 3 4 5 6 | int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { dword_13C784 = ( int )hInstance; DialogBoxParamA(hInstance, (LPCSTR) 0x65 , 0 , DialogFunc, 0 ); return 0 ; } |
分析消息函数,找到如下关键
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 26 27 28 | if ( (unsigned __int16)a3 = = 1002 ) { LOBYTE(String) = 0 ; j__memset((char * )&String + 1 , 0 , 0x3FFu ); v17 = 0 ; j__memset(&v18, 0 , 0x3FFu ); v20 = GetDlgItemTextA(hDlg, 1001 , (LPSTR)&String, 1025 ); a1 = 0 ; j__memset(&v16, 0 , 0x3FFu ); sub_CD267(( int )&String, 1024 , ( int )&v17); direct[ 0 ] = 0 ; j__memset(&direct[ 1 ], 0 , 0x3FFu ); sub_CD267(( int )&v17, 1024 , ( int )&a1); sub_CD96A(&a1, ( int )direct, 1024 ); a2 = 3 ; sub_CDA78(&a1, 3u , ( int )v12); for ( i = 0 ; i < 32 ; + + i ) j__sprintf(&re[ 2 * i], "%02x" , v12[i]); len = j__strlen(re); v6 = (char * )&String + j__strlen((const char * )&String); v7 = j__strlen(re); if ( !j__memcmp(re, &v6[ - v7], len ) ) { sub_CD0B4(); if ( j_check_map_435400(( int )&dword_13B000, direct) = = 1 ) MessageBoxA( 0 , "ok" , "CrackMe" , 0 ); } } |
同时发现对程序中使用很多反调试技术,形式如下
1 2 3 4 5 6 7 8 9 10 | if ( sub_CD1CC() = = 1 ) exit_42E086( 0 ); if ( sub_CDA96() = = 1 ) exit_42E086( 0 ); if ( sub_CD8CA() = = 1 ) exit_42E086( 0 ); if ( sub_CDD48() = = 1 ) exit_42E086( 0 ); if ( sub_CDBC7() = = 1 ) exit_42E086( 0 ); |
所以修改这些反调试函数如下,这个需要一些耐心,因为很多,可以边调试,边修改
1 2 | mov eax, 0 retn |
然后调试程序到如下地方时,发现re这个变量中存储了一个字符串,长度64,开始以为是输入的字符串加密后的结果,但是比较的字符串是你输入,同时反复调试他是不会变的,所以尝试重新运行程序输入这个字符串(183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de),结果正确
1 2 3 4 5 6 7 8 9 10 11 | for ( i = 0 ; i < 32 ; + + i ) j__sprintf(&re[ 2 * i], "%02x" , v12[i]); len = j__strlen(re); v6 = (char * )&String + j__strlen((const char * )&String); v7 = j__strlen(re); if ( !j__memcmp(re, &v6[ - v7], len ) ) { sub_CD0B4(); if ( j_check_map_435400(( int )&dword_13B000, direct) = = 1 ) MessageBoxA( 0 , "ok" , "CrackMe" , 0 ); } |
最后提交flag为183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de
赞赏
赞赏
雪币:
留言: