天天看點

xctf攻防世界 REVERSE 高手進階區 srm-50

0x1. 進入環境,下載下傳附件

題目給出了一個exe檔案,打開運作後,效果如圖:

xctf攻防世界 REVERSE 高手進階區 srm-50

0x2. 問題分析

0x2_1. 檢查是否套殼

使用exeinfo PE打開檔案,如圖:

xctf攻防世界 REVERSE 高手進階區 srm-50

沒有任何套殼。

0x2_2. 使用IDA分析

将程式丢入IDA中,搜尋main函數,F5反編譯得到僞代碼,如圖:

xctf攻防世界 REVERSE 高手進階區 srm-50

針對重點代碼進行分析:

BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
  if ( strstr(&String, "@") && strstr(&String, ".") && strstr(&String, ".")[1] && strstr(&String, "@")[1] != 46 ) // 判斷使用者輸入的郵箱格式是否正确
  {
    v28 = xmmword_410AA0;    // 輕按兩下變量,變成字元可以看到 'iaf noitartsigeR'
    v29 = 1701999980;
    *(_OWORD *)Src = xmmword_410A90; // 'cuS noitartsigeR'
    v30 = 46;
    v26 = xmmword_410A80; //  galf ruoY !ssec
    v27 = 3830633;
    if ( strlen(v11) != 16 // 前文定義v11是4位字元,但是此處是需要v11長度為16
      || v11[0] != 'C'
      || v23 != 88
      || v11[1] != 'Z'
      || v11[1] + v22 != 155
      || v11[2] != '9'
      || v11[2] + v21 != 155
      || v11[3] != 'd'
      || v20 != '7'
      || v12 != 'm'
      || v19 != 'G'
      || v13 != 'q'
      || v13 + v18 != 170
      || v14 != '4'
      || v17 != 'g'
      || v15 != 'c'
      || v16 != '8' )
    {
      strcpy_s(&Text, 0x100u, (const char *)&v28); // 如果上述條件滿足,則v28變量的内容送到提示框
    }
    else
    {
      strcpy_s(&Text, 0x100u, Src); // 将src提示資訊送入提示框
      strcat_s(&Text, 0x100u, v11); // 再将v11的資訊粘貼到src後面
    }
  }
  else
  {
    strcpy_s(&Text, 0x100u, "Your E-mail address in not valid.");
  }
  MessageBoxA(hDlg, &Text, "Registeration", 0x40u); // 傳回彈框對象
  return 1;
}      

這裡很迷糊的一點就是,明明前面定義v11是char類型的4位長度,結果if語句中判斷要求是11位,那麼到底是多少?我們輕按兩下一下v12變量,看看存放的位址,如圖:

xctf攻防世界 REVERSE 高手進階區 srm-50

var240位址是v11,存放4個位址位後,v12放在的var23C位置,那麼相當于輸入多餘的内容會放入後續的,v12,v13,v14…等位址位置,這樣看就一目了然了,将if的内容轉換成字元:

xctf攻防世界 REVERSE 高手進階區 srm-50

v11分别為:CZ9d

v12-v20分别為:mq4c8g9G7bAX