BUUCTF reverse:xor

1.查壳
BUUCTF reverse:xor_第1张图片
64位文件
2.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, 256LL);
  if ( strlen(v6) != 33 )
    goto LABEL_12;
  for ( i = 1; i < 33; ++i )
    v6[i] ^= v6[i - 1];
  v3 = global;
  if ( !strncmp(v6, global, 0x21uLL) )
    printf("Success", v3);
  else
LABEL_12:
    printf("Failed", v3);
  result = __stack_chk_guard;
  if ( __stack_chk_guard == v7 )
    result = 0;
  return result;
}

很显然

for ( i = 1; i < 33; ++i )
    v6[i] ^= v6[i - 1];
  v3 = global;
  if ( !strncmp(v6, global, 0x21uLL) )
    printf("Success", v3);

这一块代码是得出flag的关键
v6的每一位等于它本身和前一位异或的值,最后得出的结果与globle相比较,若果相等则输出“Success”
所以我们可以从global反推出flag的值
双击global找到它的值
在这里插入图片描述整理好global之后就可以开始写脚本了
写脚本的时候苦于如何判别global元素的类型,因为需要把字符型元素转为整形才可以异或
后来查了一下能实现判别对象类型的python函数才顺利实现
代码如下

s = ['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']
flag='f'
for i in range(1,len(s)):
    if (isinstance(s[i], str) and isinstance(s[i - 1], str)):
        flag += chr(ord(s[i]) ^ ord(s[i - 1]))
    elif (isinstance(s[i], str) and isinstance(s[i - 1], int)):
        flag += chr(ord(s[i]) ^ s[i - 1])
    elif (isinstance(s[i], int) and isinstance(s[i - 1], str)):
        flag += chr(s[i] ^ ord(s[i - 1]))
    else:
        flag+=chr(s[i]^s[i-1])
print(flag)

flag为flag{QianQiuWanDai_YiTongJiangHu}

你可能感兴趣的:(CTF)