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;
}
``