AVILX

REVERSING WRITEUP · CRACKMES.ONE · 2026

Crackme 0.1v

Password ofuscado en el stack via movabs en little-endian

Autor retomuhemed
Plataformacrackmes.one
Dificultad1.0 / 5.0
Arquitecturax86-64 — Unix/Linux
ModoNormal Mode — Análisis estático
AnalistaJesús Ávila (Avilx)
Fecha07 de Septiembre 2026
Portafolioavilx.dev
PASSWORD ENCONTRADO REVERSING · ASSEMBLY · CRACKME · x86-64

Documentación de aprendizaje en reversing | Entorno controlado

Información del Binario

Campo Valor
Nombrecrackme
TipoELF 64-bit LSB pie executable
Arquitecturax86-64
Enlazadodynamically linked
Strippednot stripped (with debug_info)
Stack CanaryNo Canary Found
NXEnabled
PIEEnabled
RELROPartial RELRO
Nota
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
Hallazgo
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.
Hipótesis
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
Hipótesis
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
Hallazgo
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.
Hipótesis
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'
Hallazgo
Los tres valores decodificados en little-endian producen: wvohXN8X, 7C14jrq1 y F*!j. Concatenados forman el password completo: wvohXN8X7C14jrq1F*!j.
Hallazgo
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

wvohXN8X7C14jrq1F*!j
PASSWORD ENCONTRADO
$ ./crackme
---------------------------------------------------------------------------------------
CRACKME 0.1v by muhemmed
---------------------------------------------------------------------------------------
enter the password: wvohXN8X7C14jrq1F*!j
you are cracked program good boy
Hallazgo
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 inicial10 minutos
Análisis del assembly15 minutos
Decodificación Python5 minutos
Verificación5 minutos
Total35 minutos