從一道非常簡單的題目開始瞭解 IDA

flag.exe

本次操作是來源於 ddctf 的一道入門題目!

下載flag.exe程序並打開分析輸出的有用信息

然後用 ida 32 位打開

在菜單欄上的View->Open subviews->Strings, 或者直接使用快捷鍵Shift+F12打開Strings窗口, 一鍵找出所有的字符串(定位中文)

然後找一下flag字眼

雙擊flag get字符串進入IDA View-A圖標架構, 這裏可以查看程序的邏輯樹形圖, 把程序的結構更人性化地顯示出來, 方便我們的分析. 將光標放在.rdata:00413E80

然後選擇Jump->Jump to xref to operand... 或者快捷鍵Ctrl+X查看交叉引用

如果對彙編不熟悉, 直接View->Open subviews->Generate pseudocode或者快捷鍵F5查看僞代碼

分析:

  • _mm_load_si128:加載128位值, _mm_store_si128:存儲128位值
  • strcmp函數是string compare(字符串比較)的縮寫, 用於比較兩個字符串並根據比較結果返回整數. 基本形式爲strcmp(str1,str2), 若str1=str2, 則返回零;若str1<str2, 則返回負數;若str1>str2, 則返回正數.
  • v9是隨意輸入的值, v5是是函數xmmword_413E34賦值的, 所以找到函數xmmword_413E34的值就可以了.
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  __int128 v5; // [esp+0h] [ebp-44h]
  __int64 v6; // [esp+10h] [ebp-34h]
  int v7; // [esp+18h] [ebp-2Ch]
  __int16 v8; // [esp+1Ch] [ebp-28h]
  char v9; // [esp+20h] [ebp-24h]

  // 將 xmmword_413E34 函數的值存放在 v5變量
  _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
  v7 = 0;
  v6 = qword_413E44;
  v8 = 0;
  printf("歡迎來到DUTCTF呦\n");
  printf("這是一道很可愛很簡單的逆向題呦\n");
  printf("輸入flag吧:");
  scanf("%s", &v9);
  // 比較 v5 和輸入的 v9
  v3 = strcmp((const char *)&v5, &v9);
  if ( v3 )
    v3 = -(v3 < 0) | 1;
  if ( v3 )
    printf("flag不太對呦,再試試唄,加油呦\n");
  else
    printf((const char *)&unk_413E90);
  system("pause");
  return 0;
}

雙擊函數xmmword_413E34, 可以發現其值後轉成字符串.

ok, 得到 flag, 運行 flag.exe, 將 flag的值輸入即可


最後: 歡迎大家訪問我的博客: https://fengwenhua.top , 雖然博客上面沒啥東西!

發佈了40 篇原創文章 · 獲贊 58 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章