• Home
  • Popular
  • Login
  • Signup
  • Cookie
  • Terms of Service
  • Privacy Policy
avatar

Posted by User Bot


27 Apr, 2025

Updated at 20 May, 2025

Decryption Issue with XOR and Memory Swaps in Reverse Engineering Challenge

I'm working on a reverse engineering challenge where I need to decrypt some data that involves XOR decryption followed by memory swaps. After performing both steps, the output still seems incorrect. What am I missing? How can I properly decrypt the data?

undefined8 FUN_001011f0(int argc,undefined8 *argv)

{
  int iVar3;
  undefined8 *1000_o;
  size_t pwd_len;
  undefined8 uVar4;
  _union_1457 local_b8;
  sigset_t sStack_b0;
  undefined4 local_30;
  int local_1c;
  undefined8 *arguments;
  int nb_argument;
  undefined4 local_c;
  code *pcVar2;
  undefined8 *pwd;
  
  local_c = 0;
  arguments = argv;
  nb_argument = argc;
  if (argc != 2) {
    printf("usage: %s \n",*argv);
                    /* WARNING: Subroutine does not return */
    exit(-1);
  }
  1000_o = (undefined8 *)malloc(1000);
  if (1000_o != (undefined8 *)0x0) {
    memset(&local_b8,0,0x98);
    local_b8.sa_handler = (__sighandler_t)((long)1000_o + 0x11);
    sigemptyset(&sStack_b0);
    local_30 = 0;
    iVar3 = getpagesize();
    iVar3 = mprotect((void *)((ulong)1000_o & ((long)(iVar3 + -1) ^ 0xffffffffffffffffU)),1000,7);
    if (iVar3 == -1) {
      perror("mprotect");
    }
    else {
      iVar3 = sigaction(5,(sigaction *)&local_b8,(sigaction *)0x0);
      if (iVar3 == 0) {
        pwd_len = strlen((char *)arguments[1]);
        if (pwd_len == 0x10) {
          for (local_1c = 0; local_1c < 0x86; local_1c = local_1c + 1) {
            (&DAT_00104090)[local_1c] = (&DAT_00104090)[local_1c] ^ 0x96;
          }
          pwd = (undefined8 *)arguments[1];
          *1000_o = *pwd;
          1000_o[1] = pwd[1];
          *(undefined1 *)(1000_o + 2) = *(undefined1 *)(pwd + 2);
          memcpy((void *)((long)1000_o + 0x11),&DAT_00104090,0x86);
          pcVar2 = (code *)swi(3);
          uVar4 = (*pcVar2)();
          return uVar4;
        }
        printf("Wrong password.\n");
                    /* WARNING: Subroutine does not return */
        exit(0);
      }
      perror("sigaction\n");
    }
  }
  return 0;
}
``