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

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

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