Crackme .NET con solucion, nivel medio, sin uso de debuggers

Iniciado por sadfud, 18 Diciembre 2015, 12:21 PM

0 Miembros y 1 Visitante están viendo este tema.

sadfud

Hola
En esta ocasion voy a mostrar la resolucion de este crackme (http://crackmes.de/users/shadow_/shadows_registerme/) hecho en .net, no es demasiado dificil, consta principalmente de una nag al abrir, un formulario donde introducir usuario y contraseña y otra nag al salir.
Tiene proteccion anti olly.





Esa es toda la estructura que tiene el crackme, empezaremos intentando entender el algoritmo de generacion de seriales, para ello usaremos  ilspy e ildasm. En ilspy veremos el codigo desempacado, debemos buscar en el boton register que es el que verifica nuestras credenciales.



Este es el codigo que nos devuelve
[code2=cpp]private void Button1_Click(object sender, EventArgs e)
{
this.shadow = this.rand.Next(1, 99999999);
if (Operators.ConditionalCompareObjectEqual(this.TextBox2.Text, Operators.ConcatenateObject(this.TextBox1.Text + this.TextBox3.Text + this.TextBox4.Text + this.TextBox5.Text + this.TextBox6.Text + this.TextBox7.Text + this.TextBox8.Text + this.TextBox9.Text + this.TextBox1.Text, this.shadow), false))
{
this.Button2.Enabled = true;
this.Button1.Enabled = false;
this.Button1.Text = "Registered to Shadow";
this.Text = "Registered to Shadow!";
}
else
{
Interaction.MsgBox("Incorrect serial, noob.", MsgBoxStyle.OkOnly, null);
}
}[/code2]

El codigo lo que hace es declarar una variable a la que le asigna un valor numerico generado de forma aleatoria y luego lo concatena con la informacion de una serie de textbox. Ahora tenemos que buscar que informacion contiene cada textbox, ya que en el formulario solo aparecen 2 y ahi vemos que hay hasta 9.
La informacion que buscamos la encontramos en


Echando un vistazo vemos que el textbox1 corresponde a nuestro nombre de usuario y el textbox2 es el correspondiente a la contraseña. El resto de textbox hacen una concatenacion de la siguiente manera

'username'ur'a'stupid'dumb'idiotic'crazy'noob'username'numero aleatorio

*Sin comillas

Generar un algoritmo/keygen para generar seriales validos deberia ser muy facil de no ser por el numero aleatorio del final (hasta 99999999). Para resolver este problema intentaremos ver si se puede sustituir el numero random por un numero fijo, ya que de no ser asi cada vez que generasemos un serial tendriamos una posibilidad entre 99999999  de que fuese valido, algo totalmente ridiculo.

Para ello vamos a ildasm y buscamos el boton register

Pero que buscamos exactamente aqui? Buscamos el numero  99999999 en hexadecimal para saber donde esta y en que zona mas o menos tenemos que buscar

Podemos usar mismamente la calculadora de windows



Ya sabemos que el numero aleatorio estara identificado en el codigo con 5F5E0FF



Esta es la linea que buscamos

IL_0008:  /* 20   | FFE0F505         */ ldc.i4     0x5f5e0ff

Ahora tenemos que localizar la zona donde empieza este procedimiento, osea el offset.

Method begins at RVA 0x2f60

Esa linea es la que nos interesa, el

RVA = (VA – RA)

Ahora buscamos el VA y el RA  con el programa peID

RA = 00002000

VA = 00000400

Simplemente restamos (hexadecimalmente) y obtenemos

1C00

Ahora le restamos 1C00 a 2F60 = 1360

Ahora abrimos nuestro crackme con un editor hexadecimal y nos dirigimos al offset 0x1360



Ahi tenemos marcado en verde el offset buscado y recuadrado en azul el numero aleatorio, ahora simplemente vamos a ahcer que ese numero no sea aleatorio sino que sea siempre 1.



Tal que asi.

Ahora vamos a crear un keygen, ya que el algoritmo consiste en una concatenacion vamos a hacer algo rapido en lenguaje batch

[code2=batch]@echo off
color a
:inicio
set/p nom=nombre de usuario?=
pause
cls
echo la contraseña es:
echo %nom%urastupiddumbidioticcrazynoob%nom%1
pause
cls
goto inicio[/code2]

De este modo y usando como nombre de usuario reversecoder.tk

obtenemos:



reversecoder.tkurastupiddumbidioticcrazynoobreversecoder.tk1

Verificamos



Ahora solo nos quedan las nags del principio y del final, para ello haremos un procedimiento parecido, localizaremos su posicion en memoria y quitaremos ese procedimiento.

Para la nag 1 que sale al abrir, buscamos en el ildasm



Vemos que su RVA es 3088, hacemos el mismo procedimiento que antes, es decir, le restamos 1C00 y obtenemos el offset donde se encuentra el procedimiento

0x1488

Nopeamos todas las instrucciones con ceros exxcepto el ret



Para la nag2 exactamente lo mismo, su posicion en memoria seria

3074 – 1C00 = 1474

offset nag 2 = 0x1474

Parcheamos



Ya tenemos resuelto el crackme con proteccion anti ollydbg y desarrollado en net.

Fuente:reversecoder.tk

apuromafo CLS

al momento diría que es la misma solución que plantearon en crackmes.de xD
por otro lado, los .net además hoy destaca el uso de reflector, sae y https://github.com/0xd4d/dnSpy/releases

no está de más tenerlo de referncia que hay que saber il code para tener idea que hacer o como parchar

Saludos Apuromafo

pd:buena adaptación de wordpress a smf