AVILX
REVERSING WRITEUP · HACK THE BOX · 2026
SpookyPass
Password en texto claro — Análisis estático con strings
| Plataforma | Hack The Box |
| Categoría | Reversing |
| Dificultad | Very Easy |
| Analista | Jesús Ávila (Avilx) |
| Fecha | 11 de Octubre 2026 |
| Portafolio | avilx.dev |
Documentación de aprendizaje en reversing | Entorno controlado
Información del Binario
| Campo | Valor |
|---|---|
| Nombre | pass |
| Tipo | ELF 64-bit LSB pie executable |
| Arquitectura | x86-64 |
| Enlazado | dynamically linked |
| Stripped | not stripped |
| BuildID | 3008217772cc2426c643d69b80a96c715490dd91 |
| Stack Canary | Canary Found |
| NX | Enabled |
| PIE | PIE Enabled |
| RELRO | Partial RELRO |
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
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.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:
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
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}
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
-
stringssiempre 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. -
La diferencia entre input por argumento posicional (
argv) e input interactivo (fgets/stdin) se identifica enstringsantes 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. -
Partial RELROversusFull RELROes una diferencia relevante para explotación futura: GOT parcialmente escribible habilita GOT overwrite.
Tiempo total
| Fase | Tiempo |
|---|---|
| Reconocimiento con file, checksec y strings | 5 minutos |
| Verificación y ejecución | 2 minutos |
| Total | 7 minutos |