Blog
Proyectos
Mostrando entradas con la etiqueta Retos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Retos. Mostrar todas las entradas

lunes 17 de marzo de 2008

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

viernes 29 de febrero de 2008

Reto 4

Tras un pequeño periodo de descanso, volvemos con los retos.

Pasamos de un crackme tedioso a uno sencillito para que se anime todo el mundo.

Es un crackme implementado en masm, sin ofuscación, y con un par de trucos antidebug, pero que no ofrecerá ninguna resistencia a la mayoría de vosotros.
Como es tan sencillo, esta vez será necesaria la realización de un keygen (generador de claves) para que la solución sea tomada como correcta.

Dejamos un plazo de dos semanas para el envío de la solución ( 16 de marzo), y el que envíe la solución más completa/detallada/amena/interesante se llevará una copia del libro Hacking Exposed Wireless, para cambiar un poco la temática ;)

Podeis descargaros el crackme desde aquí

Enviad tanto la solución como cualquier duda/sugerencia a labs@s21sec.com

¡Suerte!

Mikel Gastesi
S21sec labs

miércoles 2 de enero de 2008

Solución al reto 3

Es para mi un honor inaugurar el blog este año 2008 ;) , y que mejor para ello que con la entrega de los premios a los ganadores del tercer reto, Victor y Jaime.

La solución al reto consistía en un fichero de licencia del que se leían los valores que inicializaban ciertos nodos de diversas redes sencillas de petri.

En ambas soluciones, el primer paso ha consistido en dejar el código legible para lo que cada uno ha utilizado una técnica diferente. Mientras en la primera pista se sugirió utilizar un script con un plug-in para Olly, Victor ha utilizado IDA para limpiar incluso las instrucciones nulas, mientras que Jaime ha utilizado un script de python.

Con el desensamblado legible, han procedido al análisis de las redes. El código que implementaba cada hilo era tan sencillo como incrementar o decrementar un valor, pero el análisis de la consecuencia de cada modificación era una labor tediosa que ambos han resuelto magníficamente.

Tenéis a continuación ambas soluciones. Mención especial al elaborado reporte de Jaime.
- Solución de Victor
- Solución de Jaime

Ambos han ganado una copia del libro The Web Application Hacker's Handbook: Discovering and Exploiting Security Flaws, tal y como comentamos al presentaros el reto.



Mikel Gastesi
S21sec labs

jueves 27 de diciembre de 2007

Diseño del Reto 3 - Segunda pista.

Ya tenemos una solución en nuestro poder, y otra a punto de caer, por lo que damos la pista que teníamos prevista y la semana que viene publicamos las soluciones.

El crackme del tercer reto es una prueba de concepto de un pequeño estudio sobre como crear una protección en la que se prenteden utilizar uno de los puntos débiles del atacante, a la vez que una de las mayores ventajas del programador:

- El punto débil es el atacante en si, que es un ser humano y tiene una capacidad limitada de análisis de complejidad.
- La ventaja del programador es la posibilidad de crear la protección a su antojo, hacer software "inteligente", utilizar estudios previos, etc.

Se buscaba un sistema de protección que una vez lanzada la ejecución evolucione hacia un final correcto si y solo si se cumplía la premisa inicial, que en este caso era el keyfile correcto. Tras valorar otras alternativas como un algoritmo genético, se utilizaron Redes de Petri

Una red de Petri se puede ver como una red de distribución de fichas entre lugares interconectados por transiciones. Para disparar una transición, cada lugar que le apunta deberá tener una ficha y, al dispararse la transición, perderá la ficha, a la vez que se lanzará una ficha a cada lugar apuntado por la transición lanzada.

La siguiente imagen ilustra una transición de una red sencilla (se muestra en rojo la transición que se va a disparar)

También podemos dibujar el árbol de alcanzabilidad del dicha red:


Por supuesto, se pueden diseñar redes de Petri más complejas, como la que se muestra a continuación, y que ha sido utilizada en el crackme:


Junto con su árbol de alcanzabilidad:

En cada ejecución el programa puede tomar un camino diferente del árbol, pero siempre llegará a la misma solución.

La red debe estar diseñada de tal manera que si se cambia alguna ficha, no se alcance la solución correcta. Por ejemplo, si añadimos una ficha en P2, el nuevo árbol de alcanzabilidad demuestra que no se llega a la solución, por lo que el avance de la red quedara atascado y saltará el timer diciendo que la solución no es correcta.


En resumen, se aborda de manera un poco más sofisticada el arte de tocar las narices.

Referencias:
Una herramienta muy intuitiva para trabajar con redes de Petri:
http://pipe2.sourceforge.net/
Un escrito sobre el tema (requiere registro): http://www.codebreakers-journal.com/content/view/47/27/

Mikel Gastesi
S21sec labs

lunes 17 de diciembre de 2007

Pistas para el Reto 3

Se ha cumplido el plazo establecido para la resolución del reto 3, y todavía no hemos recibido ninguna solución, por lo que vamos a dar alguna pista.


Una vez desensamblado el crackme, podemos observar que el código es muy feo, que ha sido ofuscado, por lo que en primer lugar lidiaremos con este problema.

Para ello, podemos observar que todo el código es similar. En este caso se han utilizado un par de macros que introducen basura. En la imagen vemos muchos saltos que no pretenden más que dificultar el análisis del código.

Para combatir esto, nos bastará con eliminar este código muerto (instrucciones inútiles). Para ello utilizaremos, por ejemplo, el depurador OllyDbg con el plug-in OllyScript y el siguiente script.

//Inicializamos variables
var dir_obf

var pos_mem
mov pos_mem,00401000

//buscamos los bytes que nos interesan en memoria
find pos_mem, #740975070FEB06EBFD7401EB010F#
mov dir_obf, $RESULT
bucle:
//y los reemplazamos con instrucciones NOP
repl dir_obf, #740975070FEB06EBFD7401EB010F#, #9090909090909090909090909090#,14
find dir_obf, #740975070FEB06EBFD7401EB010F#

mov dir_obf, $RESULT
//hasta no encontrar ningún resultado más
cmp $RESULT, 0
je fin
jmp bucle
fin:
ret


Lanzamos este script, y como resultado obtenemos un código más legible, aunque comprobareis que queda alguna otra macro para quitar.


Seguimos analizando el funcionamiento del crackme, y vemos que la razón del alto consumo de CPU y el tiempo que tarda en mostrar el mensaje es debido a que lanza numerosos hilos que se encargan de la comprobación.


Ante esto, y viendo que el código de cada hilo es muy simple, yo me decanto por un análisis estático.
Personalmente opino que un método correcto puede consistir en sentarse con un papel y bolígrafo en frente del código y empezar a dibujar círculos y rayas. ;)
Eso sí, queda bastante claro que nos enfrentamos a una labor tediosa.

¡Que cada uno ataque por donde quiera!

No dudeis en enviar vuestra solución a labs@s21sec.com. Podeis enviar también vuestros avances/dudas en caso de que no consigais resolverlo.

Mikel Gastesi
S21sec labs

lunes 26 de noviembre de 2007

Reto 3

Vamos con el tercer reto!!

Como los dos retos anteriores, os presentamos un crackme con el cual entreteneros un rato. El reto consiste en obtener el cartel de "chico bueno" sin modificar el crackme.

Esta vez la protección va por otros derroteros, y el crackme puede tardar varios segundos en decidir si eres o no un buen chico ;)



Podéis descargar el reto de aquí.

Como siempre, una vez que lo resolváis, enviad un informe de la solución con el método utilizado a labs@s21sec.com

Hoy también tenemos premio para dos de los que nos envíen una solución correcta, y esta vez el libro en cuestión es The Web Application Hacker's Handbook: Discovering and Exploiting Security Flaws.

La solución se tomará como válida si con la resolución enviada se consigue mostrar el mensaje bueno.

Para puntuar valoraremos:
  • La solución enviada (detalle de la solución, ingenio, presentación...): Máximo 10 puntos
  • Tiempo tardado: Máximo 4 puntos


El plazo establecido es el domingo 16 de diciembre.


Suerte!!

Aviso: Durante los segundos de comprobación hace un uso un pelín brusco de la CPU ;)

Mikel Gastesi
S21sec labs

lunes 5 de noviembre de 2007

Soluciones al segundo reto

Por fín traemos las soluciones al segundo Reto que os presentamos hace un par de semanas.

Antes que nada, agradecer a dapaf, Gadix, solid, Tora y Trancek el haber participado, asi como a todo aquel que lo haya intentado.

El crackme en esta ocasión contaba con dos protecciones independientes.

1.- Establecía un gancho y vigilaba que se tecleara "S21secLabs - Reto 2" nada más iniciarse el crackme.
2.- Comprobaba que el texto introducido cumpliera una comprobación muy simple. Cualquier texto podría llevar a una solución válida, y de ahí que se pidiera una poesía.

Aquí teneis las cinco soluciones disponibles:
- dapaf
- Gadix
- solid- Tora
- Trancek

Al recibir cinco soluciones, la decisión de los "ganadores" no ha sido sencilla, asi que hemos valorado tres aspectos (corrección de la solución -50%-, tiempo tardado -25%- y detallado de la solución -25%-).



dapafGadixsolidToraTrancek
Tiempo de envío (1-5)52533
Solución correcta (1-10)108888
Explicación (1-5)34544
Total:1814181515


Por tanto, dapaf y solid son los ganadores del libro The Shellcoder's Handbook: Discovering and Exploiting Security Holes (segunda edición).
Nos pondremos en contacto mediante la dirección de correo utilizada para el envío de la solución.

Destacar que todos han enviado una solución correcta, pero ha sido dapaf el único que ha distinguido claramente las dos protecciones, viendo que no es necesario que el texto comprobado por el gancho sea introducido en la poesía.

He aquí una posible solución:





Espero que el crackme haya servido para entreteneros un rato.

Hasta el próximo reto.

Mikel Gastesi
S21sec Labs

viernes 19 de octubre de 2007

Segundo reto de ingeniería inversa

Os presentamos un segundo reto de ingeniería inversa.

El objetivo es obtener el mensaje de "chico bueno" sin parchear código. Ya que el textbox tiene espacio para ello, se valorará que el texto introducido sea (por lo menos en parte) un poema ;)

Aquí podéis ver como pinta el crackme:



Al igual que el anterior, ha sido programado en MASM, pero esta vez cada fichero ha sido empaquetado con un packer gratuito disponible en Internet.

Ha sido probado en Windows XP SP2 y en Ubuntu (con wine), y decir que el fichero es totalmente inofensivo y está libre de virus, por lo que si el antivirus os da algún aviso, será a consecuencia de una técnica de protección ;)

Os lo podeis descargar de aquí


Las dos mejores soluciones obtendrá como premio una copia del libro: The Shellcoder's Handbook: Discovering and Exploiting Security Holes (segunda edición).


Se valorará la resolución, originalidad y el nivel de detalle de la solución enviada.

Cuando lo resolváis, enviad la solución a labs@s21sec.com



Mikel Gastesi
S21sec Labs

jueves 27 de septiembre de 2007

Solución al Reto

Os presentamos las soluciones recibidas para el Reto que publicamos el día 14 de septiembre.
Antes que nada, agradecer la participación a todos aquellos que lo hayais intentado, y felicitar a Solid y Victor por haberlo conseguido.

El crackme presentaba las siguientes protecciones:

- Ofuscación mediante introducción de código muerto.
- Comprobación en el TLS (Thread Local Storage) de una máscara de bytes en memoria para cada proceso, buscando el proceso OllyDbg 1.10 en ejecución.
- Detección de un depurador utilizando VEH (Vectored Exception Handler), con un SEH(Structured Exception Handler) utilizado únicamente para tratar de ocultar el VEH.
- Rutina de comprobación matemática simple condicionada por las dos detecciones anteriores.

Como ejemplos de códigos correctos tenemos:





...o las soluciones recibidas:
Solid - -3122
3999999 - 2875

Teneis ambas soluciones disponibles:
- Solución de Solid
- Solución de Victor

Cabe destacar como Solid ha engañado al programa haciéndole creer que el depurador no está presente, de manera que intentando saltarse la protección del SEH ha conseguido saltarse también la protección del VEH. Si hubiera tratado simplemente de detener la ejecución en el manejador de excepciones instalado, posiblemente se habría topado con que al final las cuentas no salían.
También se debe mencionar que Victor, al realizar un análisis estático, no era víctima de las trampas anteriormente mencionadas. Como último detalle, aclarar que la función a la que hace referencia en su solución en realidad es una función que devuelve la raiz cuadrada del valor dado como parámetro.

Con esto damos por cerrado el primer reto, pero el juego no termina aquí.
Proximamente publicaremos más retos, y habrá premio para el ganador, asi que permaneced atentos al blog.

viernes 14 de septiembre de 2007

Un pequeño reto

El día de hoy os presentamos el primero de una serie de retos que iremos presentando esporádicamente.

En esta ocasión se trata de un crackme, al que habrá que aplicar ingeniería inversa para tratar de entenderlo y solucionarlo.

Podeis descargároslo de aquí.

Objetivos del crackme:

1.- Obtener las claves correctas.
* No se permite parchear
* No se permite aplicar fuerza bruta
2.- Desofuscar el código ofuscado.
3.- Comprender las técnicas anti-debug utilizadas.
4.- Enviar los detalles de los tres puntos anteriores a labs@s21sec.com ;)

Como podreis comprobar, el fichero no se ha empaquetado, y la ofuscación es muy simple.

Estad atentos al blog, próximamente se publicará la solución.

...y esperamos que sean las enviadas por vosotros.

 
© Copyright S21sec Gestión S.A. 2007