攻防世界 no-strings-attached(Reverse新手練習區) 解題概要 解題過程

解題概要

使用pe分析是32位文件,使用ida反彙編分析代碼邏輯,是一道要求用戶輸入flag,然後比較的題目。
正確flag並不是明文存儲,所以解題關鍵爲分析構造flag的函數。
需注意的是使用wchar_t,分析可得是32bit長(搜索得到長度可能是16或32bit)。
以下按時間順序分享解題過程。

解題過程

主函數非常直白,連續調用四個函數,然後就什麼都沒幹了。

setlocale(6, &locale);
banner();
prompt_authentication();
authenticate();

前三個函數都莫名奇妙,第一個搜索得到是用於區域設置。
第二個獲取時間,搞個隨機數種子,還輸出了歡迎語。
第三個故弄玄虛,函數裏只輸出了句話叫你輸入。
重點在第四個

void authenticate()
{
  int ws[8192]; // [esp+1Ch] [ebp-800Ch]
  wchar_t *s2; // [esp+801Ch] [ebp-Ch]

  s2 = decrypt(&s, &unk_8048A90);
  if ( fgetws(ws, 0x2000, stdin) )
  {
    ws[wcslen(ws) - 1] = 0;
    if ( !wcscmp(ws, s2) )
      wprintf("S");
    else
      wprintf("A");
  }
  free(s2);
}

fgetws是wchar_t版的fgets
wcscmp同樣是wchar_t版的strcmp

看到!wcscmp(ws, s2)第一反應便是flag在這裏。
ws來自用戶輸入,那麼s2就是flag了。
而s2來自decrypt。看來這就是構造flag的代碼了。
decrypt這個函數還算簡單,自己轉成c或py運行一遍即可得到flag。
簡單分析下,實際上是循環用a2去減走s的數據。兩者差值恰好在ASCII範圍內,相減後直接轉爲字符類型即可。
疑點
ida反彙編得到的c代碼中,用於flag數組下標的v4並沒有初始化爲0。
v4在棧中的地址是ebp-1Ch
而只有用於a2下標的var_18[ebp-18h]被初始化爲0。
可能題目出現了錯誤,忘記初始化v4了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章