Baby RE
1 minuto de lectura
Se nos proporciona un binario llamado baby
:
$ file baby
baby: ELF 64-bit LSB shared object, 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
Si lo ejecutamos, pregunta por una clave:
$ ./baby
Insert key:
Podemos introducir una clave y ver que no es correcta:
$ ./baby
Insert key:
1234
Try again later.
Podemos hacer uso de ltrace
para ver las llamadas a funciones externas (funciones que pertenecen a librerías como Glibc):
$ ltrace ./baby
puts("Insert key: "Insert key:
) = 13
fgets(
Por ejemplo, utiliza puts
para mostrar el mensaje y fgets
para leer nuestra entrada. Si ponemos algo de texto, vemos algo interesante:
$ ltrace ./baby
puts("Insert key: "Insert key:
) = 13
fgets(1234
"1234\n", 20, 0x7fb37e452980) = 0x7fffa441c7a0
strcmp("1234\n", "abcde122313\n") = -48
puts("Try again later."Try again later.
) = 17
+++ exited (status 0) +++
Está comparando nuestra entrada con "abcde122313\n"
, por lo que esta es la clave que tenemos que introducir:
$ ./baby
Insert key:
abcde122313
HTB{B4BY_R3V_TH4TS_EZ}
Hay tres maneras más de resolver el reto:
- Descompilar el binario con Ghidra o IDA para ver la instrucción
strcmp
. - Utilizar un depurador como GDB para obtener el valor esperado de la clave.
- Ejecutar
strings
sobre el binario para visualizar la clave válida.