首页
论坛
专栏
课程

[原创]2019看雪ctf第一题解题思想(学过半个多月的新手)

2019-3-23 21:19 612

[原创]2019看雪ctf第一题解题思想(学过半个多月的新手)

2019-3-23 21:19
612

0.前言

前几天忙着复试没时间做,复试结束回学校,尝试了一下,侥幸做出来了。学了半个多月的新手,半蒙半猜做。

1.IDA静态分析

shift+F12查看字符串出现的位置,如下图:

 

图片描述
下一步,肯定查看“恭喜”,按x查看对它的引用,往上追溯。

1.1 sub_401770()

这个函数是弹成功窗口

BOOL sub_401770()
{
  HANDLE hProcess; // ST5C_4
  MessageBoxA(0, "pass!", "恭喜!", 0);
  hProcess = GetCurrentProcess();
  return TerminateProcess(hProcess, 0);
}

查看对这个函数的引用

1.2 sub_4017F0

传入参数a1是一个整型数组,关键的逻辑是strcmp(Str1, "KanXueCTF2019JustForhappy"),其中对于while循环,可以看出来是对aAbcdefghiabcde数组的映射,然后产生了str1数组,也就是产生了最后要比较的字符串。

int __cdecl sub_4017F0(int a1)
{
  int result; // eax
  char Str1[28]; // [esp+D8h] [ebp-24h]
  int v3; // [esp+F4h] [ebp-8h]
  int v4; // [esp+F8h] [ebp-4h]

  v4 = 0;
  v3 = 0;
  while ( *(_DWORD *)(a1 + 4 * v4) < 62 && *(_DWORD *)(a1 + 4 * v4) >= 0 )
  {
    Str1[v4] = aAbcdefghiabcde[*(_DWORD *)(a1 + 4 * v4)];
    ++v4;
  }
  Str1[v4] = 0;
  if ( !strcmp(Str1, "KanXueCTF2019JustForhappy") )
    result = sub_401770();
  else
    result = sub_4017B0();
  return result;
}

再次查看引用

1.3 sub_401890

这个函数就是输入str,然后对str进行一些变换,成为v5整型数组。

int __thiscall sub_401890(CWnd *this)
{
  struct CString *v1; // ST08_4
  CWnd *v2; // eax
  int v3; // eax
  int v5[26]; // [esp+4Ch] [ebp-74h]
  int i; // [esp+B4h] [ebp-Ch]
  char *Str; // [esp+B8h] [ebp-8h]
  CWnd *v8; // [esp+BCh] [ebp-4h]

  v8 = this;
  v1 = (CWnd *)((char *)this + 100);
  v2 = CWnd::GetDlgItem(this, 1002);
  CWnd::GetWindowTextA(v2, v1);
  v3 = sub_401A30((char *)v8 + 100);
  Str = CString::GetBuffer((CWnd *)((char *)v8 + 100), v3);
  if ( !strlen(Str) )
    return CWnd::MessageBoxA(v8, "请输入pass!", 0, 0);
  for ( i = 0; Str[i]; ++i )
  {
    if ( Str[i] > 57 || Str[i] < 48 )
    {
      if ( Str[i] > 122 || Str[i] < 97 )
      {
        if ( Str[i] > 90 || Str[i] < 65 )
          sub_4017B0();
        else
          v5[i] = Str[i] - 29;
      }
      else
      {
        v5[i] = Str[i] - 87;
      }
    }
    else
    {
      v5[i] = Str[i] - 48;
    }
  }
  return sub_4017F0((int)v5);
}

至此,大致逻辑已经清楚,由于本事不高,算法逆不出来。下面上动态调试。

2.动态调试

strcmp处下断点,直接调试程序。随便输入一些内容,比如ABCDEFGHIJKLMN,然后 查看str的内容

 

图片描述

 

可以看到这串字符,这时候发现aAbcdefghiabcde数组中有这串字符。aAbcdefghiabcde的内容为abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ,猜想是一种移位密码,于是接下来分别验证,得到了一个映射如下。

 

图片描述
前面的是输入,后面的对应输出str。

3.求解

根据映射关系,进行对应,得到sn

 

图片描述



[招聘]欢迎市场人员加入看雪学院团队!

最后于 2019-3-24 11:08 被wx_哈哈哈编辑 ,原因: 代码显示
最新回复 (0)
游客
登录 | 注册 方可回帖
返回