首页
社区
课程
招聘
[原创]看雪CTF2017秋季赛-第三题writeup
发表于: 2017-10-28 18:35 2339

[原创]看雪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


[注意]看雪招聘,专注安全领域的专业人才平台!

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

账号登录
验证码登录

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