[SWPUCTF 2021 新生赛]re2

这道题有两个答案
先看题目
image
查壳
无壳,64位
image
丢入ida64,找main函数,F5看伪代码
image

点击查看代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char Str2[64]; // [rsp+20h] [rbp-90h] BYREF
  char Str[68]; // [rsp+60h] [rbp-50h] BYREF
  int v7; // [rsp+A8h] [rbp-8h]
  int i; // [rsp+ACh] [rbp-4h]

  _main();
  strcpy(Str2, "ylqq]aycqyp{");
  printf(&Format);
  gets(Str);                                    // str为flag
  v7 = strlen(Str);
  for ( i = 0; i < v7; ++i )
  {
    if ( (Str[i] <= 96 || Str[i] > 98) && (Str[i] <= 64 || Str[i] > 66) )
      Str[i] -= 2;
    else
      Str[i] += 24;
  }
  if ( strcmp(Str, Str2) )
    printf(&byte_404024);
  else
    printf(aBingo);
  system("pause");
  return 0;
}
分析可知道,此题是解密str2,关键在for循环,因为str2通过if判断之后减2或24,所以逆的时候,if判断条件也应该减2,然后就很容易解了

源码

image

点击查看代码
flag = ''
str2 = 'ylqq]aycqyp{'
for i in range(len(str2)):
    if (ord(str2[i]) <= 94 or ord(str2[i]) > 96) and (ord(str2[i]) <= 64 or ord(str2[i]) > 66):
        flag += chr(ord(str2[i])+2)
    else:
        flag += chr(ord(str2[i])-24)
print(flag)

flag:{nss_c{es{r}

但提交不正确,看别人的wp才知道两个答案都对,但{nss_caesar}能提交
不过这不重要,理解作者出题意向就行了

posted @ 2022-11-13 10:43  Zer0o  阅读(578)  评论(0编辑  收藏  举报