Español | English
rss facebook linkedin Twitter

Solución al reto 4

Vamos con la solución del cuarto reto.

Gracias a todos los que habeis enviado las soluciones y, como no, a todos aquellos que lo hayais intentado.

Este crackme tiene dos protecciones:
- En el TLS (Thread Local Storage) se comprueba que no se haya cargado en memoria un proceso con determinados bytes en determinada posición. Se trata de comprobar que el depurador OllyDbg no esté en ejecución. Si se encuentra dicho proceso, se altera un valor constante, obteniendo un resultado diferente para la rutina de comprobación.
- Se llama a BlockInput para bloquear teclado y ratón durante dicha comprobación. Basta con pulsar Ctrl+Alt+supr para forzar el desbloqueo.

Por supuesto, los que hayan realizado un análisis estático no se habrán tenido que preocupar de estas protecciones.

La comprobación consta de aplicar una función a cada valor, y comprobar si ambos resultados son iguales.
Al valor de la izquierda se le aplicaba una "raiz cuadrada", mientras que el valor derecho es multiplicado por 3 y se le suma una constante.

De tal manera, un keygen válido programado en python puede ser el siguiente:

#!/usr/bin/python
import random
num_2 = random.randint(0,500)
num_1 = (num_2*3+5)**2
print "Izquierda: ", num_1, " Derecha: ", num_2


Obteniendo valores como:

Izquierda: 734449 Derecha: 284
Izquierda: 978121 Derecha: 328
Izquierda: 760384 Derecha: 289
Izquierda: 64516 Derecha: 83

Esta vez hemos recibido cinco soluciones, dos con el keygen en c (Fermin y Mario), una en delphi (stzwei), una en MASM (solid) y la última en python(Satur).

Viendo las soluciones, vemos que mientras algunos reimplementan la función que transforma el primer valor, hay quien copia y pega la función en el keygen. Algunos han tenido que tratar con el BlockInput, bien parcheando una instrucción, bien pulsando Ctrl+Alt+Supr, mientras que los que utilizan análisis estático no lo han tenido en cuenta. Cada maestrillo tiene su librillo.

A continuación os presentamos las cuatro soluciones:
- Fermin J. Serna
- Mario Ballano
- stzwei
- solid
- Satur

En esta ocasión el ganador del libro es Fermin, que ha contemplado en el keygen la comprobación de OllyDbg en memoria, introduciendo la comprobación de bytes en los procesos.

En respuesta a las notas del propio Fermin sobre los handles abiertos y la falta de comprobación de errores (tiene toda la razón), cito una frase que él mismo utiliza en el keygen ;)
"// This is a (5 minutes coded) keygen.. controlling errors??? get a life..."

Editado: Incluyo la solución de Satur. Disculpad el descuido, me olvidaba de una solución muy completa.

Mikel Gastesi
S21sec labs

4 comentarios:

Trancek dijo...

buen reto, a esperar al proximo y a ver si lo termino antes :P que este como te dije me quede viendo que pasaba con el numero variable. Y bueno estuve viendo las soluciones y la de Zhodiac era parecida a la mia, menos mal que al final iba por el buen camino ejej

Saludos a todos ;)

S21sec labs dijo...

A ver si el siguiente es el tuyo, Trancek.

Gracias por estar ahí

David Sánchez Lavado dijo...

Creo que habéis recibido más de 4 soluciones y alguna más completa de las que he podiod leer.

Me podéis dar algún motivo de porque no ponéis las otras soluciones para que así la gente pueda valorar vuestro criterio. Yo creo que la gente que ha trabajado en dar la solución se merece ese detalle.

Gracias.

S21sec labs dijo...

Hola David,

He revisado los mails y tienes, razón, se me ha traspapelado una solución. :(

Mis mas sinceras disculpas para Satur.
Por supuesto, no ha habido motivo alguno, sino un descuido muy gordo, y pido perdón por ello.

Subiré su solución el martes que viene, ya que antes no me va a ser posible acceder al servidor.

Saludos,


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login