从一道非常简单的题目开始了解 IDA

江南小虫虫 2020年02月14日 67次浏览

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的值输入即可