逆向学习--BUUCTF--xor

下载 解压之后,发现是一个文件夹加一个名为xor的文件,先用Exeinfo分析一下,不知道为什么得出的结果和网上的大佬不一样,不过这无关紧要。
逆向学习--BUUCTF--xor_第1张图片
可以知道是64bit,所以丢到IDA里面分析一下,进去之后,找到main函数并且F5反汇编得到的代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char *v3; // rsi
  int result; // eax
  signed int i; // [rsp+2Ch] [rbp-124h]
  char v6[264]; // [rsp+40h] [rbp-110h]
  __int64 v7; // [rsp+148h] [rbp-8h]

  memset(v6, 0, 0x100uLL);
  v3 = (char *)256;
  printf("Input your flag:\n", 0LL);
  get_line(v6, 0x100u);
  if ( strlen(v6) != 33 )      //可以知道flag是33位
    goto LABEL_12;
  for ( i = 1; i < 33; ++i )
    v6[i] ^= v6[i - 1];       //将输入的字符串从第二位开始,后一位与前一位异或
  v3 = global;   
  if ( !strncmp(v6, global, 0x21uLL) )   //并将计算完的值和在global储存放的字符串进行比较
    printf("Success", v3);
  else
LABEL_12:
    printf("Failed", v3);
  result = __stack_chk_guard;
  if ( __stack_chk_guard == v7 )
    result = 0;
  return result;
}

由此,我们知道,在global存放的字符串是执行过上述算法后得到的字符串,所以,将上面的字符串反过来处理也就能得到flag了。

str1 = ['f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v',
        '"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O']

x = 'f'

for i in range(1, len(str1)):
    if (isinstance(str1[i], str)):
        if (isinstance(str1[i - 1], str)):
            x += chr(ord(str1[i]) ^ ord(str1[i - 1]))
        else:
            x += chr(ord(str1[i]) ^ str1[i - 1])
    else:
        x += chr(str1[i] ^ ord(str1[i - 1]))

print(x)

运行后得到flag

你可能感兴趣的:(Reverse)