Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: PeterPunk77 en 23 Noviembre 2011, 01:56 am



Título: [Reto] Diofanto's Crackme
Publicado por: PeterPunk77 en 23 Noviembre 2011, 01:56 am
Buenas a todos,
aquí les traigo un nuevo y sencillo crackme para Windows.
Éste es bastante más sencillo que el Dioniso's (http://foro.elhacker.net/ingenieria_inversa/reto_dionisos_crackme-t345585.0.html) o al menos a mi me lo parece y para cada nombre existen multitud de seriales válidos.
Parchearlo no tiene ninguna ciencia (con cambiar un byte es suficiente) pero puede que algún novato quiera practicarlo.
El siguiente grado de dificultad sería pescar un serial válido realizando un programita de fuerza bruta. Indicado para novatos avanzados o con ganas de aprender.
Y por último (lo que harán MCKSys Argentina, _Enko , .:UND3R:. , ...) es programar un keygen con múltiples seriales válidos para cada nombre (sin usar fuerza bruta claro está).

link 1 -> http://www.megaupload.com/?d=0WPEQFSF
link 2 -> http://www.2shared.com/file/aQskIPBy/Diofantos_Crackme.html

Suerte a todos.
Saludos.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 23 Noviembre 2011, 02:15 am
un keygenme prolijo en masm, y como toque extra fpu  :silbar:



Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 23 Noviembre 2011, 02:41 am
Estodo biejon Descargado los dos crackmes
 ::)


Título: Re: [Reto] Diofanto's Crackme
Publicado por: MCKSys Argentina en 23 Noviembre 2011, 16:54 pm
Y por último (lo que harán MCKSys Argentina, _Enko , .:UND3R:. , ...) es programar un keygen con múltiples seriales válidos para cada nombre (sin usar fuerza bruta claro está).

Es obligatorio????  ;D

Si hago un tiempito, lo miro...  :silbar:

Saludos!

AH!!!

"Transeúnte, esta es la tumba de Diofanto: es él quien con esta sorprendente distribución te dice el número de años que vivió. Su niñez ocupó la sexta parte de su vida; después, durante la doceava parte su mejilla se cubrió con el primer bozo. Pasó aún una séptima parte de su vida antes de tomar esposa y, cinco años después, tuvo un precioso niño que, una vez alcanzada la mitad de la edad de su padre, pereció de una muerte desgraciada. Su padre tuvo que sobrevivirle, llorándole, durante cuatro años. De todo esto se deduce su edad."

 :D


Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 23 Noviembre 2011, 17:08 pm
Bueno mi duda sobre este crackme
nombre=flamer
serial=1234-67890abc
en la direccion 0040111C le pasan a EAX el valor de mi serial(los primeros 4 caracteres) en hexadesimal que lo podemos ver en el dump y queda asi EAX=34333231 y despues en la siguiente linea se inicializa ECX=4 despues una resta SUB AL,41 despues una comparacion CMP AL,1A y despues un salto JNB que es el del flags c el cual para que salte EAX tiene que ser menor a ECX que bale 4
mi pregunta es que seriaal tengo
 que insertar para que en el dump valga 0 que EAX=0000005A


Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 23 Noviembre 2011, 17:20 pm
Uff disculpen las molestias el serial quedaria asi para que saltara
nombre=flamer
serial=ZZZZ-67890abc

saludos ;D


Título: Re: [Reto] Diofanto's Crackme
Publicado por: MCKSys Argentina en 23 Noviembre 2011, 19:54 pm
Mi primer analisis (rústico)

Código:
USER:
CRCNAME = 50554E4B
for i = 0 to len(user)
    CRCNAME = tablita(low_byte(CRCNAME) xor user[i]) XOR (CRCNAME / 256)

Luego, CRCNAME es un DWORD, de donde salen: CRCNAME[0], CRCNAME[1], CRCNAME[2] y CRCNAME[3]


SERIAL:
4 chars + "-" + 8 chars
ABCD-0123ABCD
s1 + "-" + s2

s1 tiene chars desde 41h a 5Bh ("A" - "Z")
cada char de s1 se le resta 41h. se obtiene t1.

suma = t1[0] + t1[1] * 26 + t1[2] * 676 + t1[3] * 17576
suma debe ser mayor que 1000!

s2 tiene chars HEXA (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
cada char de s2 se le resta 30h. se obtiene t2.

for pos = 0 to 8
 b1 = (8 - pos - 1) * 4
 sum_s2 += t2[pos] * 2^b1

abs((sum_s2 * sum_s2 * CRCNAME[3]+1) + (suma * -1) + (sum_s2^4 * CRCNAME[1]+1)) < 0.25 ==> Serial correcto

En estos días veo de reversear bien y hacer el KG.

Saludos!


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 23 Noviembre 2011, 21:45 pm
Yo lo unico que tuve tiempo de  sacar es que forzosamente los primeros 4 caracteres son "MMBA" para que sea igual a 1000 (3E8h).
Aunque ahora que lo veo hoy, la suma no debe ser igual a ese numero sino mayor xD



Título: Re: [Reto] Diofanto's Crackme
Publicado por: Pablo Videla en 23 Noviembre 2011, 21:49 pm
Voy a tener que aprender hacer este tipo de cosas  :xD


Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 24 Noviembre 2011, 03:38 am
Una pregunta amigos
nombre=FLAMER
serial=ABCD-01234567
mi duda es en la direccion 004011D9
lo que en tiendo que la instruccion FLD carga o le pasa el valor 2,998817e-38 a ST0 pero mi duda es de donde sale ese valor
saludos


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 24 Noviembre 2011, 06:12 am
De momento no estoy como para publicar el keygen, tengo que hacer algunas optimizaciones.

User: Enko
Pass:
BEEC-40708291
SIFB-C04EE399
LUBD-C083963E
LQUA-C0398EFC
VFJB-C055417F
VFJB-C055417F
IVBA-3FBF9034
SIFB-C04EE399
LQUA-C0398EFC
ZWBA-3FC176AF
OVFQ-40C8DBBE
OVFQ-40C8DBBE
ZWBA-3FC176AF



Saludos.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: PeterPunk77 en 25 Noviembre 2011, 13:04 pm
Enhorabuena a todos. Ya veo que no ha durado nada el crackme. Pues nada, ahora a solucionar el Dioniso's.
Saludos.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 25 Noviembre 2011, 13:43 pm
Enhorabuena a todos. Ya veo que no ha durado nada el crackme. Pues nada, ahora a solucionar el Dioniso's.
Saludos.
No del todo.

la formula es esta:
Código:
abs(k4^2*k2 - k1 + k4^4*k3) = k5  > 0.25   y par.   
k1,k2 y k3 dependen del crc del nombre.
k4 son los ultimos 8 digitos hexa del serial.

La solucion correcta, en teoria es despejar de la ecuacion k4. Es una ecuacion bicuadratica, por ende:
X = k4^2

de esa forma nos quedaria:
k3x^2 + k2x - k1-k5

Se despeja las dos raices de X y luego despejamso k^2 como sqrt(x) y nos da otras dos raices de K. En total 4 raices. (de las cuales usamos una sola).

Lo que no me sale es programar la fpu para que haga la resolvente y luego elegir la raiz correcta.

Saludos.



Título: Re: [Reto] Diofanto's Crackme
Publicado por: PeterPunk77 en 30 Noviembre 2011, 21:45 pm
Perdona _Enko, pero no entiendo qué problema tienes.
Efectivamente el crackme no es más que una ecuación bicuadrada que evidentemente tiene 4 posibles soluciones y cualquiera de ellas debería ser válida. Yo sólo he hecho una prueba para comprobar que todo estuviese correcto y con la solución obtenida con los positivos de las raíces cuadradas no he obtenido ningún error.
Saludos.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 30 Noviembre 2011, 23:23 pm
No me llevo muy bien con la fpu.
Intente un par de veces resolver las raices de la bicuadratica pero no ha resultado...

No estaba seguro si eran mis pesimos conocimientos de matematica (no tenia ni idea de como se resolvia una cuadratica), o mis otras pesimas habiliades con la fpu.

voy a ver si en estos dias intento arreglar el tema con las raices y la fpu, o bien terminaria reescribiendo todo en C o algo parecido.



Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 1 Diciembre 2011, 16:33 pm
yo me doy ya me enfade con los crackmes (todos) ya medio coraje con todos los pendientes que tengo; eso me pasa por andar pidiendo crackmes. boy a tomar un descanso mejor por que no tengo pasiensia ni animos de seguir con el tema.
me quede con la instruccion FLD
al raton
saludos flamer


Título: Re: [Reto] Diofanto's Crackme
Publicado por: Flamer en 1 Diciembre 2011, 16:34 pm
yo me doy ya me enfade con los crackmes (todos) ya medio coraje con todos los pendientes que tengo; eso me pasa por andar pidiendo crackmes. boy a tomar un descanso mejor por que no tengo pasiensia ni animos de seguir con el tema.
me quede con la instruccion FLD
al raton
saludos flamer


Título: Re: [Reto] Diofanto's Crackme
Publicado por: .:UND3R:. en 1 Diciembre 2011, 16:44 pm
yo me doy ya me enfade con los crackmes (todos) ya medio coraje con todos los pendientes que tengo; eso me pasa por andar pidiendo crackmes. boy a tomar un descanso mejor por que no tengo pasiensia ni animos de seguir con el tema.
me quede con la instruccion FLD
al raton
saludos flamer

Creo que se debe a estás juntando muchos a mi me suele suceder y simplemente borro mi máquina virtual y parto de nuevo con 0 crackmes, tomo uno o dos y empiezo a trabajar con ellos, si no están a mi alcance intento nuevamente con otro,
Saludos


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 2 Diciembre 2011, 07:14 am
Keygen:
http://www.mediafire.com/?3myalaqt3iy5eg3

(genera 10 llaves aleatorias por intento)
Saludos.



Título: Re: [Reto] Diofanto's Crackme
Publicado por: Иōҳ en 2 Diciembre 2011, 15:42 pm
Creo que se debe a estás juntando muchos a mi me suele suceder y simplemente borro mi máquina virtual y parto de nuevo con 0 crackmes, tomo uno o dos y empiezo a trabajar con ellos, si no están a mi alcance intento nuevamente con otro,
Saludos

Y porqué borras tu VM?, tan solo hasle un snapshot y listo.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 2 Diciembre 2011, 15:53 pm
Y porqué borras tu VM?, tan solo hasle un snapshot y listo.

O copiar y pegar el archivo del disco rigido ^^


Título: Re: [Reto] Diofanto's Crackme
Publicado por: .:UND3R:. en 2 Diciembre 2011, 17:11 pm
O copiar y pegar el archivo del disco rigido ^^

Pues copio nuevamente el snaptshot

Saludos


Título: Re: [Reto] Diofanto's Crackme
Publicado por: PeterPunk77 en 5 Diciembre 2011, 02:56 am
Keygen:
http://www.mediafire.com/?3myalaqt3iy5eg3

(genera 10 llaves aleatorias por intento)
Saludos.


Enhorabuena Enko,
ya sabía que al final no ibas a tener ningún problema (aunque pensé que lo ibas a programar en asm32).
Por cierto, ese crackme es el Diofanto no el Dioniso:
Diofanto está considerado uno de los padres del algebra.
Dioniso era el dios griego del vino.

Saludos.


Título: Re: [Reto] Diofanto's Crackme
Publicado por: _Enko en 7 Diciembre 2011, 18:00 pm
peterpunk, el crackme lo hice mitad/mitad. C/Asm

La parte del CRC la hice en asm (practicamente copypast de tu rutina original)
La parte del keygen en si, en C.

Para convertir un FLOAT a su representacion hex de 32 bit tambien tuve que usar asm inline. Usando un puntero y leyendo byte a byte me daba otro resultado.
Aqui el fuente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <windows.h>
  5.  
  6. unsigned int __stdcall crc_check(char *, unsigned int);
  7. unsigned int __stdcall crc_table();
  8. unsigned int __stdcall _rand(unsigned int);
  9. extern unsigned int randseed;
  10.  
  11.  
  12.  
  13. int main(void)
  14. {
  15. int iCount, tCount;
  16. char serial[]= "1111-";
  17. char user[] = "0000000000000000";
  18. unsigned int kx, k1, k2, k3, k4, k5, r;
  19. float r1,a,b,c;
  20. printf("User: ");
  21. scanf("%s", &user);
  22. randseed = GetTickCount();
  23. crc_table();
  24. kx = crc_check(user, strlen(user));
  25. for(tCount=0; tCount<=10; tCount++){
  26. for(iCount=0; iCount<=3; iCount++)
  27. serial[iCount] = (char) _rand(26);
  28. k1 = (serial[3] * 0x44A8) + (serial[2] * 0x2A4) + (serial[1] * 0x1A) + (serial[0]) ;
  29.  
  30. for(iCount=0; iCount<=3; iCount++)
  31. serial[iCount] += 65;
  32.  
  33. k2 = (kx & 0xFF) + 1;
  34. k3 = ((kx >> 0x10) & 0xFF) + 1;
  35. a = k3; //180
  36. b = k2; //146
  37. c = k1; //33k
  38. r1 =  (-b + sqrt(b * b + 4 * a * c)) / (2 *a);
  39. r1 = sqrt(r1);
  40.  
  41. printf("%s", serial);
  42. __asm{
  43. push eax
  44. mov eax, r1
  45. mov r, eax
  46. pop eax
  47. }
  48.  
  49. printf("%X", r);
  50. printf("\n");
  51. }
  52. system("pause");
  53. return 0;
  54. }
  55.  
Código
  1. include '%fasminc%\win32a.inc'
  2.  
  3. format MS COFF
  4.  
  5. public crc_table as '_crc_table@0'
  6. public crc_check as '_crc_check@8'
  7. public _rand as '__rand@4'
  8. public randseed as '_randseed'
  9.  
  10.  
  11. section '.text' code readable executable
  12.  
  13. proc _rand, range  
  14. mov eax,[range]
  15. imul edx, [randseed], 0x08088405
  16. inc edx
  17. mov [randseed], edx
  18. mul edx
  19. mov eax, edx
  20. ret
  21. endp
  22.  
  23.  
  24. proc crc_table
  25. push esi edi ebx
  26. mov     edi, 0xEDB8832D
  27. inc     edi
  28. xor     ebx, ebx
  29. mov     ecx, table
  30. .crc_start:
  31. movzx   eax, bx
  32. add     eax, eax
  33. mov     dx, 0xFFF7
  34. .first:
  35. test    al, 1
  36. je      .next
  37. shr     eax, 1
  38. xor     eax, edi
  39. jmp     .over
  40. .next:
  41. shr     eax, 1
  42. .over:
  43. inc     dx
  44. jnz     .first
  45. mov     [ecx], eax
  46. inc     ebx
  47. add     ecx, 4
  48. cmp     bx, 0x100
  49. jnz     .crc_start
  50. pop ebx edi esi
  51. ret
  52. endp
  53.  
  54. proc crc_check, user, len    
  55. push esi edi ebx  
  56. mov     ebx, [user]          
  57. mov     esi, [len]          
  58. mov     edi, 0x50554E4B
  59. .crc_start:          
  60. mov     edx, edi              
  61. mov     eax, [ebx]            
  62. and     eax, 0xFF              
  63. xor     al, dl                
  64. mov     eax, [eax*4+table]    
  65. shr     edx, 8                
  66. xor     eax, edx              
  67. mov     edi, eax              
  68. inc     ebx                    
  69. dec     esi                    
  70. jnz     .crc_start
  71. not     edi                    
  72. mov     eax, edi
  73. pop ebx edi esi
  74. ret              
  75. endp
  76.  
  77. section '.data' data readable writeable
  78. randseed dd 0
  79. table dd 0xFF dup ?
  80.  

pd: A... Diofanto, asi la bicuadratica tiene mas sentido con el nombre.

Gracias por el buen crackme, podria ahora hacerlo completamente en asm ya que el problema no era la fpu, sino la resolvente estaba buggeada.