Baby RE Writeup

Publicado el 11 de noviembre de 2023

Challenge creado por Xh4H

Este challenge es una introducción a la ingeniería inversa. El objetivo es encontrar la contraseña del archivo comprimido 'Baby RE.zip'.

Primero descomprimimos el archivo zip, en mi caso he utilizado la version GUI del sistema ya que no me dejaba el comando unzip.

En caso de no contar con GUI es posible utilizar otra herramienta como 7z probablemente.

La contraseña del archivo zip es 'hackthebox'

Una vez descomprimimos el archivo podemos observar que contiene un archivo 'baby' que es un ejecutable

┌─[ruflas@parrot]─[~/Downloads]
└──╼ $file baby
baby: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=25adc53b89f781335a27bf1b81f5c4cb74581022, for GNU/Linux 3.2.0, not stripped

Concedemos permisos de ejecución con el comando:

chmod +x baby

Al ejecutarlo nos pide una contraseña, si introducimos una incorrecta nos muestra un mensaje de error.

Probamos a ver los strings del ejecutable:

┌─[ruflas@parrot]─[~/Downloads]
└──╼ $strings baby

Podemos observar que hay una cadena que nos dice lo siguiente:

Dont run `strings` on this challenge, that is not the way!!!!
Insert key:
abcde122313

Try again later.

Ya hemos obtenido la contraseña pero dado que esta no es la forma correcta de resolver el reto probaremos a ver el codigo en assembly del ejecutable.

Para ello utilizaremos la herramienta Ghidra:

En la imagen podemos observar el código en assembly (y cuando miremos mas a fondo en C).

En la parte de la izquierda podemos observar que hay una función llamada 'main' que es la que se ejecuta al ejecutar el programa.

En la parte de la derecha, despues de hacer click en main, podemos observar el código en C de la función 'main'.

undefined8 main(void)
{
int iVar1;
undefined8 local_48;
undefined8 local_40;
undefined4 local_38;
undefined2 local_34;
char local_28 [24];
char *local_10;
local_10 = "Dont run `strings` on this challenge, that is not the way!!!!";
puts("Insert key: ");
fgets(local_28,0x14,stdin);
iVar1 = strcmp(local_28,"abcde122313\n");
if (iVar1 == 0) {
local_48 = 0x594234427b425448;
local_40 = 0x3448545f5633525f;
local_38 = 0x455f5354;
local_34 = 0x7d5a;
puts((char *)&local_48);
}
else {
puts("Try again later.");
}
return 0;
}

Facilmente veremos el mensaje de error bajo un else que nos lleva hasta un if donde podemos ver como se comparan dos cadenas de texto.

Observamos como si la cadena es:

abcde122313

El programa en principio se ejecutara correctamente.

Probamos que la contraseña sea correcta:

┌─[ruflas@parrot]─[~/Downloads]
└──╼ $./baby
Insert key:
abcde122313

HTB{BTH4T_3V3RY_7IM3}

Y ya tenemos la contraseña del archivo comprimido.

Comentarios