-
-
[原创]看雪CTF2017秋季赛-第三题writeup
-
2017-10-28 18:35 1868
-
首先拿到题目运行一下,可以看出这是一个windows窗口程序
拖到IDA中,查找WinMain 找到对话框的消息函数
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { dword_13C784 = (int)hInstance; DialogBoxParamA(hInstance, (LPCSTR)0x65, 0, DialogFunc, 0); return 0; }
分析消息函数,找到如下关键
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); } }
同时发现对程序中使用很多反调试技术,形式如下
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);
所以修改这些反调试函数如下,这个需要一些耐心,因为很多,可以边调试,边修改
mov eax,0 retn
然后调试程序到如下地方时,发现re这个变量中存储了一个字符串,长度64,开始以为是输入的字符串加密后的结果,但是比较的字符串是你输入,同时反复调试他是不会变的,所以尝试重新运行程序输入这个字符串(183920f00e15a0433ee3a8fc90dd9ac164c4142ccf63ca189a8f645ec96ff8de),结果正确
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
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
看原图