Ir al contenido

Behind The Scenes

Autor
Santiago Chavarro

Funcionamiento
#

$ qemu-amd64 -L /usr/x86_64-linux-gnu/ behindthescenes

./challenge <password>

Podemos concluir que la contraseña sera la misma flag

Reto
#

Cuando trate de decompilar el binario en ghidra note una parte que no se lograba decompilar de una forma correcta:

001012e6 0f 0b           UD2
001012e8 83              ??         83h
001012e9 bd              ??         BDh
001012ea 5c              ??         5Ch    \
001012eb ff              ??         FFh
001012ec ff              ??         FFh
001012ed ff              ??         FFh
001012ee 02              ??         02h
001012ef 74              ??         74h    t
001012f0 1a              ??         1Ah
001012f1 0f              ??         0Fh
001012f2 0b              ??         0Bh
...

Solución
#

Para resolver esto toca patchear el binario para esto seleccionamos la instrucción UD2 que es la responsable del problema oprimimos Ctrl + Shift + G y lo cambiamos por NOP despues de esto seleccionamos la instrucción inmediatamente inferior hasta el que dejemos de ver el patrón de ?? y oprimimos d luego de hacer esto aparecieron mas instrucciones UD2 por lo que repetimos el proceso hasta que no quede ninguna, y luego oprimimos A

De modo que observaremos que la función main tiene mas contenido y se ve así:

undefined8 main(int param_1,long param_2)

{
  code *pcVar1;
  int iVar2;
  size_t sVar3;
  long in_FS_OFFSET;
  sigaction local_a8;
  long local_10;
  
  local_10 = *(long *)(in_FS_OFFSET + 0x28);
  memset(&local_a8,0,0x98);
  sigemptyset(&local_a8.sa_mask);
  local_a8.__sigaction_handler.sa_handler = segill_sigaction;
  local_a8.sa_flags = 4;
  sigaction(4,&local_a8,(sigaction *)0x0);
  if (param_1 != 2) {
    pcVar1 = (code *)invalidInstructionException();
    (*pcVar1)();
  }
  sVar3 = strlen(*(char **)(param_2 + 8));
  if ((((sVar3 == 0xc) && (iVar2 = strncmp(*(char **)(param_2 + 8),"Itz",3), iVar2 == 0)) &&
      (iVar2 = strncmp((char *)(*(long *)(param_2 + 8) + 3),"_0n",3), iVar2 == 0)) &&
     ((iVar2 = strncmp((char *)(*(long *)(param_2 + 8) + 6),"Ly_",3), iVar2 == 0 &&
      (iVar2 = strncmp((char *)(*(long *)(param_2 + 8) + 9),"UD2",3), iVar2 == 0)))) {
    printf("> HTB{%s}\n",*(undefined8 *)(param_2 + 8));
  }
  if (local_10 == *(long *)(in_FS_OFFSET + 0x28)) {
    return 0;
  }
  __stack_chk_fail();
}

Podemos ver que concatena una cadena que parece ser la contraseña la cadena es Itz_0nLy_UD2

$ qemu-amd64 -L /usr/x86_64-linux-gnu/ behindthescenes Itz_0nLy_UD2
> HTB{Itz_0nLy_UD2}

Referencias
#