这道题也不难就是有几个函数是平常没见过的。这道题我们来学习一下几个函数,以后做题碰到就知道函数是干嘛的了。
文件是一个可执行程序。先来查一下壳。用PEiD这个工具查壳。发现是没有的。我就不粘贴图片了
接下来放进IDA中进行伪代码分析。在函数栏中找到这个函数 如图

伪代码如下:

进入DialogFunc函数
int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4)
{
  char v5; // [esp+50h] [ebp-310h]
  CHAR Text[4]; // [esp+154h] [ebp-20Ch]
  char v7; // [esp+159h] [ebp-207h]
  __int16 v8; // [esp+255h] [ebp-10Bh]
  char v9; // [esp+257h] [ebp-109h]
  int v10; // [esp+258h] [ebp-108h]
  CHAR String; // [esp+25Ch] [ebp-104h]
  char v12; // [esp+25Fh] [ebp-101h]
  char v13; // [esp+260h] [ebp-100h]
  char v14; // [esp+261h] [ebp-FFh]
?
  memset(&String, 0, 0x104u);
  v10 = 0;
  if ( a2 == 16 )
  {
    DestroyWindow(hWnd);
    PostQuitMessage(0);
  }
  else if ( a2 == 273 )
  {
    if ( a3 == 1000 )
    {
      GetDlgItemTextA(hWnd, 1002, &String, 260);
      strlen(&String);
      if ( strlen(&String) > 6 )
        ExitProcess(0);
      v10 = atoi(&String) + 1;
      if ( v10 == 123 && v12 == 120 && v14 == 122 && v13 == 121 )
      {
        strcpy(Text, "flag");
        memset(&v7, 0, 0xFCu);
        v8 = 0;
        v9 = 0;
        _itoa(v10, &v5, 10);
        strcat(Text, "{");
        strcat(Text, &v5);
        strcat(Text, "_");
        strcat(Text, "Buff3r_0v3rf|0w");
        strcat(Text, "}");
        MessageBoxA(0, Text, "well done", 0);
      }
      SetTimer(hWnd, 1u, 0x3E8u, TimerFunc);
    }
    if ( a3 == 1001 )
      KillTimer(hWnd, 1u);
  }
  return 0;
}
看完整体思路不难理解。先来了解几个函数
是把字符串转换成整型数的一个函数。 int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。 特别注意,该函数要求被转换的字符串是按十进制数理解的。atoi输入的字符串对应数字存在大小限制(与int类型大小有关),若其过大可能报错-1。
是将整形转换为字符串 char_itoa(int value,char* string,int radix); 参数说明 value-----要转换的整形值 string-----转换后的字符串 radix------表示基数(2, 8, 10, 16)等进制基数
其实flag的大部分内用已经给出就差一个V5是未知的我们就来分析V5
_itoa(v10, &v5, 10);
这个函数我们已经了解
所以V5=123 flag=flag{123_Buff3r_0v3rf|0w}
原文:https://www.cnblogs.com/Mua2Uncle2blog/p/15161113.html