AVILX
REVERSING WRITEUP · CRACKMES.ONE · 2026
Crackme 0.1v
Password ofuscado en el stack via movabs en little-endian
| Autor reto | muhemed |
| Plataforma | crackmes.one |
| Dificultad | 1.0 / 5.0 |
| Arquitectura | x86-64 — Unix/Linux |
| Modo | Normal Mode — Análisis estático |
| Analista | Jesús Ávila (Avilx) |
| Fecha | 07 de Septiembre 2026 |
| Portafolio | avilx.dev |
Documentación de aprendizaje en reversing | Entorno controlado
Información del Binario
| Campo | Valor |
|---|---|
| Nombre | crackme |
| Tipo | ELF 64-bit LSB pie executable |
| Arquitectura | x86-64 |
| Enlazado | dynamically linked |
| Stripped | not stripped (with debug_info) |
| Stack Canary | No Canary Found |
| NX | Enabled |
| PIE | Enabled |
| RELRO | Partial RELRO |
Sin canary significa que el stack no está protegido contra desbordamiento. Junto con el debug_info presente, el binario es especialmente fácil de analizar estáticamente.
Reconocimiento
Análisis inicial
Strings
$ strings -a ./crackme | grep -v "^_Z\|GLIBC\|\.so\|\."
[Mensajes del programa]
enter the password:
you are cracked program good boy
nope you are bad boy
[Strings sospechosos]
wvohXN8XH
7C14jrq1H
F*!jH
[Funciones relevantes]
strcmp
printf
scanf
Se identificaron tres strings sospechosos:
wvohXN8XH, 7C14jrq1H y F*!jH. El programa usa strcmp para comparar el input del usuario con algo. Los mensajes confirman que es un validador de password.Los tres strings sospechosos podrían ser el password dividido en partes o variables internas. El siguiente paso es probarlos directamente y analizar el assembly de
main para entender cómo se usan.Ejecución inicial
$ ./crackme
-------------------------------------------------------------------
CRACKME 0.1v by muhemmed
-------------------------------------------------------------------
enter the password: wvohXN8XH
nope you are bad boy
enter the password: 7C14jrq1H
nope you are bad boy
enter the password: F*!jH
nope you are bad boy
Ninguno de los tres strings funciona individualmente como password. Están ofuscados o son fragmentos que deben concatenarse.
Análisis del Flujo
Función main
1174: movabs rax, 0x58384e58686f7677 ; carga 8 bytes en rax
117e: movabs rdx, 0x3171726a34314337 ; carga 8 bytes en rdx
1188: mov [rbp-0xe0], rax ; guarda primer fragmento en stack
118f: mov [rbp-0xd8], rdx ; guarda segundo fragmento en stack
1196: mov [rbp-0xd0], 0x6a212a46 ; guarda tercer fragmento en stack
El programa carga el password directamente en el stack usando
movabs con valores inmediatos. Tres fragmentos consecutivos forman el password completo. Los valores están almacenados en formato little-endian.Los valores
0x58384e58686f7677, 0x3171726a34314337 y 0x6a212a46 son el password en little-endian. Decodificando cada uno se obtienen los fragmentos del password real.Decodificación little-endian
python3 -c "
import struct
v1 = struct.pack('<Q', 0x58384e58686f7677)
v2 = struct.pack('<Q', 0x3171726a34314337)
v3 = struct.pack('<I', 0x6a212a46)
print('v1:', v1)
print('v2:', v2)
print('v3:', v3)
"
# Output:
# v1: b'wvohXN8X'
# v2: b'7C14jrq1'
# v3: b'F*!j'
Los tres valores decodificados en little-endian producen:
wvohXN8X, 7C14jrq1 y F*!j. Concatenados forman el password completo: wvohXN8X7C14jrq1F*!j.El password es la concatenación de los tres fragmentos del stack. Los strings
wvohXN8XH, 7C14jrq1H y F*!jH que aparecieron en strings tenían un byte extra H que correspondía al siguiente byte en memoria.Solución
Algoritmo identificado
El programa carga el password fragmentado en el stack usando movabs. Cada fragmento está en little-endian. La concatenación de los tres fragmentos decodificados forma el password válido.
Script de decodificación
python3 -c "
import struct
v1 = struct.pack('<Q', 0x58384e58686f7677).decode()
v2 = struct.pack('<Q', 0x3171726a34314337).decode()
v3 = struct.pack('<I', 0x6a212a46).decode()
print('Password:', v1 + v2 + v3)
"
# Output: Password:
Password encontrado
PASSWORD ENCONTRADO
$ ./crackme
---------------------------------------------------------------------------------------
CRACKME 0.1v by muhemmed
---------------------------------------------------------------------------------------
enter the password: wvohXN8X7C14jrq1F*!j
you are cracked program good boy
El password
wvohXN8X7C14jrq1F*!j fue verificado exitosamente. El programa respondió: “you are cracked program good boy”Reflexión Final
Qué salió bien
El reconocimiento inicial con strings reveló los fragmentos del password aunque no en su forma final. El análisis del disassembly de main confirmó rápidamente que los valores estaban cargados con movabs en little-endian, técnica ya vista en el compendio de reversing.
Qué salió mal
Los strings individuales wvohXN8XH, 7C14jrq1H y F*!jH no funcionaron como password directo. Inicialmente no era obvio que eran fragmentos a concatenar. Probarlos directamente fue un intento fallido necesario para descartar esa hipótesis.
Lecciones aprendidas
Este fue el segundo crackme resuelto, elegido intencionalmente de dificultad 1.0 para retomar el ritmo después de 6 días sin estudiar.
La técnica de movabs con valores en little-endian es común para ofuscar strings en binarios sin cifrado real. El password está en el binario en texto claro pero fragmentado y en orden invertido de bytes. strings lo revela parcialmente pero el assembly de main confirma la estructura completa.
Tiempo total
| Fase | Tiempo |
|---|---|
| Reconocimiento inicial | 10 minutos |
| Análisis del assembly | 15 minutos |
| Decodificación Python | 5 minutos |
| Verificación | 5 minutos |
| Total | 35 minutos |