首页
社区
课程
招聘
[原创]2019看雪ctf第一题解题思想
发表于: 2019-3-23 21:19 4016

[原创]2019看雪ctf第一题解题思想

2019-3-23 21:19
4016

前几天忙着复试没时间做,复试结束回学校,尝试了一下,做出来了。

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

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

这个函数是弹成功窗口

查看对这个函数的引用

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

再次查看引用

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

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

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

图片描述

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

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

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

图片描述

 
BOOL sub_401770()
{
  HANDLE hProcess; // ST5C_4
  MessageBoxA(0, "pass!", "恭喜!", 0);
  hProcess = GetCurrentProcess();
  return TerminateProcess(hProcess, 0);
}
BOOL sub_401770()
{
  HANDLE hProcess; // ST5C_4
  MessageBoxA(0, "pass!", "恭喜!", 0);
  hProcess = GetCurrentProcess();
  return TerminateProcess(hProcess, 0);
}
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;
}
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;
}
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);
}
int __thiscall sub_401890(CWnd *this)

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-3-6 17:56 被gxkyrftx编辑 ,原因: 代码显示
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//