AVILX

REVERSING WRITEUP · HACK THE BOX · 2026

SpookyPass

Password en texto claro — Análisis estático con strings

PlataformaHack The Box
CategoríaReversing
DificultadVery Easy
AnalistaJesús Ávila (Avilx)
Fecha11 de Octubre 2026
Portafolioavilx.dev
FLAG OBTENIDA REVERSING · ASSEMBLY · HTB · x86-64

Documentación de aprendizaje en reversing | Entorno controlado

Información del Binario

Campo Valor
Nombrepass
TipoELF 64-bit LSB pie executable
Arquitecturax86-64
Enlazadodynamically linked
Strippednot stripped
BuildID3008217772cc2426c643d69b80a96c715490dd91
Stack CanaryCanary Found
NXEnabled
PIEPIE Enabled
RELROPartial RELRO
Nota
A diferencia de retos anteriores, este binario tiene Partial RELRO en lugar de Full RELRO. Esto significa que la GOT (Global Offset Table) es parcialmente escribible, lo que en un escenario de explotación abriría la puerta a ataques de GOT overwrite. Para los propósitos de este challenge no es relevante, pero es una diferencia que vale registrar. El binario no está stripped, por lo que los símbolos como main, parts y demás etiquetas internas son visibles.

Reconocimiento

Análisis inicial

strings

$ strings -a ./pass | grep -v "^_Z\|GLIBC\|\.so\|\."

fgets
strchr
printf
strcmp
Welcome to the [1;3mSPOOKIEST
Before we let you in, you'll need to give us the password:
s3cr3t_p455_f0r_gh05t5_4nd_gh0ul5
Welcome inside!
You're not a real ghost; clear off!
parts
main
Hallazgo
El comando strings reveló el password s3cr3t_p455_f0r_gh05t5_4nd_gh0ul5 en texto completamente claro. El binario usa strcmp para la comparación, lo que confirma que el password se almacena como literal en la sección de datos y se compara directamente contra el input del usuario sin ningún tipo de transformación o cifrado. También son visibles los mensajes de respuesta: “Welcome inside!” para el password correcto y “You’re not a real ghost; clear off!” para el incorrecto.
Hipótesis
El password es s3cr3t_p455_f0r_gh05t5_4nd_gh0ul5. El nombre del símbolo parts visible en strings sugiere que el código podría tener alguna estructura interna de validación, pero dado que el password completo aparece en claro, no es necesario profundizar más para resolver el reto.

Ejecución inicial

$ ./pass
Welcome to the SPOOKIEST party of the year.
Before we let you in, you'll need to give us the password:
Hallazgo
El binario presenta un prompt interactivo que espera el password por stdin. A diferencia del reto anterior (Behind the Scenes), aquí el input se recibe mediante fgets y no como argumento posicional.

Solución

Password encontrado

s3cr3t_p455_f0r_gh05t5_4nd_gh0ul5
PASSWORD ENCONTRADO
$ ./pass
Welcome to the SPOOKIEST party of the year.
Before we let you in, you'll need to give us the password:
s3cr3t_p455_f0r_gh05t5_4nd_gh0ul5
Welcome inside!
HTB{un0bfu5c4t3d_5tr1ng5}
Hallazgo
Password correcto. El binario imprime la flag HTB{un0bfu5c4t3d_5tr1ng5} directamente. El nombre de la flag — unobfuscated strings — es una referencia directa a la técnica usada para resolverlo: el password no tiene ninguna capa de ofuscación.

Reflexión Final

Qué salió bien

El flujo estándar de reconocimiento funcionó exactamente como se espera en un binario sin ofuscación. strings en el primer paso reveló la credencial completa. No fue necesario ir más allá del reconocimiento estático.

Comparación con retos anteriores

Este reto contrasta directamente con Behind the Scenes, resuelto en la misma sesión. Mientras que en aquel el password estaba fragmentado en cuatro strings separados en .rodata para evadir strings, en SpookyPass el password aparece completo y sin ningún tipo de protección. La flag del reto lo confirma: unobfuscated strings.

La diferencia es importante: en el contexto real de análisis de malware, la presencia o ausencia de ofuscación de strings es uno de los primeros indicadores del nivel de sofisticación de una muestra. Un binario que deja credenciales en claro es básicamente lo que se conoce como un dropper sin protecciones.

Lecciones

  1. strings siempre es el primer paso. En binarios sin ofuscación resuelve el reto directamente. En binarios con ofuscación indica qué no está en claro y dirige el análisis hacia .rodata, Ghidra o GDB.

  2. La diferencia entre input por argumento posicional (argv) e input interactivo (fgets/stdin) se identifica en strings antes de ejecutar el binario: si aparece un mensaje de uso como ./binario <password>, es argumento; si aparece un prompt como “Enter your password:”, es stdin.

  3. Partial RELRO versus Full RELRO es una diferencia relevante para explotación futura: GOT parcialmente escribible habilita GOT overwrite.

Tiempo total

Fase Tiempo
Reconocimiento con file, checksec y strings5 minutos
Verificación y ejecución2 minutos
Total7 minutos