Mencioné el programa
Check Point Security Academy varias veces en Habré: su esencia es que la compañía
Check Point anunció un concurso en el formato Capture the Flag en el verano, donde la experiencia pasada del participante no es importante, sino solo su capacidad para desentrañar el ciber rompecabezas Con base en los resultados de esta competencia, la compañía reclutó a veinte participantes para un curso profesional de tres meses en seguridad cibernética, y todos los participantes desde el comienzo del curso reciben el salario completo de un especialista en KB, bajo la obligación de trabajar en la compañía dos años después del final del curso.
En una competencia CTF, una bandera puede ser incluso una imagen, como esta.La selección de participantes se completó en agosto, pero el sitio web del concurso continuará funcionando hasta el próximo verano, e invito a aquellos que deseen registrarse y probar suerte por el interés deportivo. La competencia consta de 12 rompecabezas de diversa complejidad, clasificados de 10 a 150 puntos.
Aquí quiero analizar el rompecabezas "Probar mi paciencia" de la categoría "Sorpresa". Ella es de dificultad media (50 puntos), y aquí está su texto completo:
Hola
Encontramos este ejecutable en la computadora del relojero local.
Se rumorea que de alguna manera el relojero fue la única persona que logró descifrarlo.
¿Crees que eres tan bueno como el relojero?
Nota: este archivo no es malicioso de ninguna manera
Por referencia: un binario de 32 bits para Windows, que
algunos antivirus recomiendan , pero si aún lo ejecuta, se ve así:

Dentro del binario está encriptado; Se niega a ejecutarse bajo el depurador; Si intenta conectarle un depurador mientras está en ejecución, termina inmediatamente. Probablemente, los especialistas de Check Point envolvieron su rompecabezas en un paquete de cifrado, prestado de algún tipo de malvari.
¿Cómo vamos a adivinar el número compuesto por el relojero?
Hay dos formas El primero puede llamarse condicionalmente "hay poder, no importa": si el programa no se puede depurar en vivo, ¡depuraremos al muerto!
Lanzamos el "Administrador de tareas" de 32 bits (\ Windows \ SysWOW64 \ taskmgr.exe), hacemos clic derecho en el misterioso proceso y seleccionamos Crear archivo de volcado. (El Administrador de tareas de 64 bits para procesos de 32 bits crea un volcado del emulador wow64cpu, con el que es más difícil trabajar).
Miramos en el basurero y vemos que al menos las líneas ya están descifradas:

Pero las líneas con el número oculto o la bandera aún no son visibles.
Pasamos al arma de calibre principal: WinDbg (X86) -> Open Crash Dump ...

¿En qué parte de la memoria está impresa la línea que queremos ver: "Buen trabajo, amigo mío"?
El comando
lm
permite determinar que el binario se carga de
01140000
a
015b2000
; entonces
sa 01140000 015b2000 "Good job my friend!"
encuentra la cadena de búsqueda en
0115a0d0
:

Ahora busquemos dónde se imprime esta línea: ¿quizás algún comando contiene bytes
d0 a0 15 01
correspondientes a la dirección de la línea que está buscando? (
sb 01140000 015b2000 d0 a0 15 01
)
Buena suerte - tal equipo fue encontrado:

¿Cuál es el código alrededor de este comando? (
ub 011412f7; u 011412f7
)

Vemos que, dependiendo del resultado de la función
01141180
se imprime el mensaje deseado o "Incorrecto ..."
El código de función
01141180
ocupa tres pantallas; es bastante fácil ver que se trata de una implementación de
strcmp()
con una llamada
Sleep(700)
agregada en su interior. Todavía no está claro por qué hay
Sleep()
; pero aún así no afecta el resultado de la función, por lo que será mejor averiguar qué cadenas se comparan:

Se
ebp-14h
dos punteros iguales a
ebp-14h
y
ebp-24h
; el segundo de ellos se pasó a la función
011410b0
como
011410b0
.
¿No es esta la función que solicita el número oculto? Verifiquemos la pila de llamadas (
k
):

Si, es ella!
El esquema general del rompecabezas ahora está claro: la corazonada del usuario se almacena en
ebp-24h
, el número
ebp-14h
en
ebp-14h
, luego se comparan y se imprime "¡Buen trabajo, amigo!" O "Incorrecto ...".
Todo lo que queda es extraer el número oculto del marco de la pila. Ya conocemos su
ebp
de la pila de llamadas:

Vamos, vamos ...

Éxito! Puedes descorchar algo sabroso.
Pero tres cosas misteriosas quedaron sin explicación:
- ¿Por qué hay una llamada a
Sleep(700)
dentro del strcmp()
Sleep(700)
? - ¿Por qué, cuando ingresamos el número oculto, el programa se congeló durante diez segundos antes de imprimir “¡Buen trabajo, amigo!”?
- ¿Qué tiene que ver el relojero con este rompecabezas?
Entonces, resulta que hay una segunda forma, más inteligente, de adivinar el número adivinado. Si solo intenta al azar los números 0-9, es fácil notar que en el nueve el programa se "cuelga" un poco. Si prueba los números 90-99, puede ver que en el número 98 el programa se "congela" el doble de tiempo. (Después de haber descubierto sus agallas, ya entendemos cuál es el problema: una comparación exitosa de cada par de caracteres causa un retraso de 0.7 s.) Para resolver el rompecabezas sin siquiera iniciar el depurador, fue suficiente seleccionar cada dígito siguiente para que el retraso antes de la respuesta aumentara, ya sea manualmente con un cronómetro exacto o un guión simple. Por lo tanto, los compiladores insinuaron un
método de larga data para atacar algoritmos criptográficos , cuando se mide y analiza el tiempo hasta un mensaje de error.
Pero, en mi opinión, aprender a recoger programas envueltos en crypto-packers desconocidos es más interesante y más valioso :-)
Tenga en cuenta que no necesitábamos averiguar cómo se encripta el binario o cómo aparece la cadena con el número que ve en la pila (vimos en el volcado que no está entre las constantes de la cadena): logramos prepararnos y estar listos, y para eso alrededor de una docena de comandos WinDbg fueron suficientes.