[ACTF新生赛2020]easyre 1

发布时间 2023-05-03 14:20:47作者: TFOREVERY

下载回来后,有两个文件

查那个内存大的就行,上边那个扔着不管就行

查壳

32位,进IDA,老套路,进主函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _BYTE v4[12]; // [esp+12h] [ebp-2Eh] BYREF
  _DWORD v5[3]; // [esp+1Eh] [ebp-22h]
  _BYTE v6[5]; // [esp+2Ah] [ebp-16h] BYREF
  int v7; // [esp+2Fh] [ebp-11h]
  int v8; // [esp+33h] [ebp-Dh]
  int v9; // [esp+37h] [ebp-9h]
  char v10; // [esp+3Bh] [ebp-5h]
  int i; // [esp+3Ch] [ebp-4h]

  __main();
  qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
  printf("Please input:");
  scanf("%s", v6);
  if ( v6[0] != 65 || v6[1] != 67 || v6[2] != 84 || v6[3] != 70 || v6[4] != 123 || v10 != 125 )
    return 0;
  v5[0] = v7;
  v5[1] = v8;
  v5[2] = v9;
  for ( i = 0; i <= 11; ++i )
  {
    if ( v4[i] != _data_start__[*((char *)v5 + i) - 1] )
      return 0;
  }
  printf("You are correct!");
  return 0;
}

看着不是很难弄,那么问题来了,flag的输出哪里来?找了好多地方,啥也没有。只看到了v5被初始了,那么有没有可能v5里存的就是我们要找的flag的字符串呢?

能看出来,这个判断是关键,已知v4:"*F'"N,"(I?+@",那么先看看 data_start_ 里边是个啥,跟进 data_start_ :

那么问题就知道了,比较v4中的字符和data数据中的字符.找到对应字符相等的位置,也就是下标。下标就是我们的flag。(这里有个小坑,我们是要找v5里存放的值,但看伪代码,我们能知道v5-1的值才是拿来比较的字符所在下标,写脚本的时候注意这一点)

int main(){
    char v[] = {'*','F','\'','\"','N',',','\"','(','I','?','+','@','\0'};
    string s = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !\"";
    string flag = "";
    for(int i = 0; i < strlen(v); i++) {
        for (int j = 0; j < s.size(); j++) {
            if (s[j] == v[i]) {
                flag += (char)(j+1);
                break;
            }
        }
    }
    cout << flag << endl;
    return 0;
}

得到flag{U9X_1S_W6@T?}收工