Mysterious---攻防世界


Mysterious---攻防世界

這道題也不難就是有幾個函數是平常沒見過的。這道題我們來學習一下幾個函數,以后做題碰到就知道函數是干嘛的了。

文件是一個可執行程序。先來查一下殼。用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;
}

看完整體思路不難理解。先來了解幾個函數

1.atoi

是把字符串轉換成整型數的一個函數。 int atoi(const char *nptr) 函數會掃描參數 nptr字符串,會跳過前面的空白字符(例如空格,tab縮進)等。如果 nptr不能轉換成 int 或者 nptr為空字符串,那么將返回 0 。 特別注意,該函數要求被轉換的字符串是按十進制數理解的。atoi輸入的字符串對應數字存在大小限制(與int類型大小有關),若其過大可能報錯-1。

2._itoa

是將整形轉換為字符串 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}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM