int __fastcall main(int argc, const char **argv, const char **envp)
{
  _DWORD v4[38]; // [rsp+0h] [rbp-A0h]
  int j; // [rsp+98h] [rbp-8h]
  int i; // [rsp+9Ch] [rbp-4h]

  printf("Input: ");
  for ( i = 0; i <= 35; ++i )
    __isoc99_scanf("%d");
  for ( j = 0; j <= 35; ++j )
  {
    if ( (v4[j] ^ 0x66) != cipher[j] )
    {
      printf("no");
      return 0;
    }
  }
  printf("yes");
  return 0;
}

非常简单的逻辑

v4[j] ^ 0x66) != cipher[j]

v4跟 0x66异或然后跟cipher比较

^在C语言中是异或的意思

.data:0000000000404040 cipher          dd 0Bh, 9, 3, 5, 12h, 0, 1Dh, 24h, 52h, 15h, 0Fh, 5, 39h
.data:0000000000404040                                         ; DATA XREF: main+88↑o
.data:0000000000404074                 dd 1Eh, 56h, 14h, 39h, 5, 0Eh, 7, 57h, 0Ah, 3, 8, 1, 3
.data:00000000004040A8                 dd 39h, 15h, 9, 0Ah, 10h, 3, 2, 2 dup(47h), 1Bh
[0x0B,0x09,0x03,0x05,0x12,0x00,0x1D,0x24,0x52,0x15,0x0F,0x05,0x39,
0x1E,0x56,0x14,0x39,0x05,0x0E,0x07,0x57,0x0A,0x03,0x08,0x01,0x03,
0x39,0x15,0x09,0x0A,0x10,0x03,0x02,0x47,0x47,0x1B]

异或过去我们再异或一遍0x66

#include <stdio.h>
main()
{
    int a[] = {0x0B,0x09,0x03,0x05,0x12,0x00,0x1D,0x24,0x52,0x15,0x0F,0x05,0x39,
           0x1E,0x56,0x14,0x39,0x05,0x0E,0x07,0x57,0x0A,0x03,0x08,0x01,0x03,
           0x39,0x15,0x09,0x0A,0x10,0x03,0x02,0x47,0x47,0x1B};
    int b[36];
    for (int i = 0; i <= 35; ++i)
    {
        b[i] = a[i] ^ 0x66;
        printf("%c",b[i]);
    }
}

moectf{B4sic_x0r_cha1lenge_solved!!}