Título: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: PeterPunk77 en 23 Noviembre 2011, 14:25 pm Buenas a todos. Lo cierto es que no suelo escribir ningún tutorial porque cuando lo hago tardo muchísimo más en crearlo que lo que he tardado en saltarme una protección y crear un parche/keygen. Y eso me desespera. Pero el siguiente lo he escrito por deferencia al autor.
El crackme en cuestión fue un desafío publicado a mediados de Agosto con motivo de la Ekoparty de este año: http://blogs.eset-la.com/laboratorio/2011/08/15/crackme-de-eset-para-ekoparty-2011/ Los que lo hayáis estudiado o los que lo hagáis sin leer el tutorial veréis que se trata de un crackme muy simple y que resulta obvio de "keygenear" (inventando palabras desde ...). Pero tal vez no os deis cuenta de lo bien programado que está el manejador de excepciones, así que publico este tutorial (previamente publicado en otros foros) porque espero que sea instructivo para cualquier persona que comienza en este apasionante mundo de la ingeniería inversa. Saludos. Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: PeterPunk77 en 23 Noviembre 2011, 14:25 pm Tutorial del sencillo pero interesante crackme de ESET Primero debería haber abierto el crackme con el PEiD o cualquier otro programa, pero confiando en la experiencia lo abrí sin más con el OllyDbg. Bien, parecía programado en MASM32, así que seguro que iba a estar todo bastante claro, además es el lenguaje que normalmente utilizo para mis crackmes y keygens. Veo que no tiene mensaje de "chico bueno" y en seguida aprecio que lo primero que hace tras pulsar el botón OK es poner un controlador de errores. Supongo el error que busca pero por el momento no le hago caso. Luego lee el nombre introducido (mínimo 4 letras, máximo 19) y entra en un procedimiento 0x401000 que parece la inicialización de un MD5, así que paso de las dos siguientes llamadas y compruebo lo que hizo. Pues tenía razón, veo en el dump el hash MD5 de mi nick "PeterPunk" (empieza por 8D y acaba en 9D). A continuación suma los 16 bytes (más exactamente conjuntos de 8 bits) que componen el hash, y multiplica el resultado por 3. Así que para "PeterPunk" obtengo 0x163E. Unas imágenes para aclarar esto: (http://i53.tinypic.com/alj67q.jpg)(http://i55.tinypic.com/211q695.jpg) Vemos como el PEiD coincide conmigo tanto en el lenguaje de programación como en el uso del hash MD5. (http://i51.tinypic.com/30hofex.jpg) Esta es la parte de código que acabo de comentar. (http://i53.tinypic.com/wl2iwg.jpg) Y en ésta apreciamos como en 0x404344 se encuentra el MD5 de "PeterPunk". Lo siguiente que hace el crackme es leer el serial (número entero con signo). Al número introducido como serial se le suma el resultado del cálculo anterior y se le resta 0x42B8. Luego divide 1 entre el resultado anterior y muestra el mensaje de "Chico malo". Obviamente y aunque el cracker en cuestión no entienda de excepciones va a suponer que lo único a lo que aspira es a que esa división sea entre 0, y a ver que pasa. Así que probamos 17080 (0x42B8) - 5694 (0x163E) = 11386 (qué número más bonito, acaba en 386). Probamos con la dupla "PeterPunk", "11386" y por arte de magia obtengo un mensaje de "chico bueno". Otra tanda de imágenes: (http://i56.tinypic.com/144bj1w.jpg) Aquí vemos la parte de código que acabo de comentar y apreciamos que no hay comparación posible del serial introducido. Y aparentemente obligatoriedad de mostrar el mensaje de "Chico malo". Por lo que sólo parece posible forzar una división por 0. (http://i56.tinypic.com/s5ioth.jpg)(http://i52.tinypic.com/n4fqsg.jpg) Esta es mi dupla típica. "PeterPunk" y "81818181" que irremediablemente siempre me devuelve el mensaje de error. (http://i52.tinypic.com/2h7zzf7.jpg)(http://i54.tinypic.com/on62o.jpg) Si meto el valor que fuerza una división por 0 me muestra un mensajito de que soy bueno. Por tanto vemos que cualquier persona que comience con el maravilloso mundo de la ingeniería inversa va a poder resolver el crackme, pero igual no se dan cuenta de lo verdaderamente interesante del mismo, el procedimiento programado para el control de excepciones. Como he comentado con anterioridad en el primer vistazo del crackme reparé en que existía un procedimiento para controlar las posibles excepciones. Está definido en: Código: 00402353 |. BE 62224000 MOV ESI,00402262 Lo voy a ir despiezando para comentar que es lo que hace cada cosa: Código: 00402265 |. 8B5C24 08 MOV EBX,[ESP+8] A continuación: Código: 00402269 |. 813B 940000C0 CMP DWORD PTR [EBX],C0000094 Código: 00402276 |. 8B7B 0C MOV EDI,[EBX+C] Código: 0040227C |. 8B4424 10 MOV EAX,[ESP+10] Código: 00402280 |. C700 10000100 MOV DWORD PTR [EAX],10010 Código: 0040228C |. 8978 04 MOV [EAX+4],EDI Código: 00402296 |. 83EF 12 SUB EDI,12 Código: 0040229F |. 83A8 C4000000 04 SUB DWORD PTR [EAX+C4],4 Todo esto está muy bien, pero ¿para qué hemos creado un punto de ruptura en la instrucción siguiente al mensaje? Pues porque al llegar a esa instrucción, va a saltar la excepción STATUS_SINGLE_STEP (0x80000004) que también está controlada en el código manejador de excepciones: Código: 004022B4 |> \813B 04000080 CMP DWORD PTR [EBX],80000004 O sea, como hemos puesto el breakpoint, cuando el código llega a esa instrucción (tras mostrar el mensaje de "Chico bueno"), nos salta una excepción, y con nuestro controlador de excepciones volvemos al procedimiento 0x402262.Ahí primero va a comprobar, como hemos visto antes, que el error sea 0xC0000094 (EXCEPTION_INT_DIVIDE_BY_ZERO) y como no lo es ya nos salta a la parte de código que acabo de pegar. Al igual que antes vemos que EAX va a apuntar a la estructura CONTEXT. Después vuelve a llamar al procedimiento que cambia el mensaje (esta vez el de "Chico bueno" por el de "Chico malo") para que no quede el bueno fijo ya que sino, aunque a continuación metiésemos un serial malo nos mostraría el bueno (eso sí, con el icono de error en el mensaje). También vuelve a cambiar las banderas (ContextFlags) aunque sigo convencido de que esto no hace falta y esta vez borra el contenido de [EAX+4] (Debug Register #0) y cambia el valor de [EAX+18] (Debug Control o DR7) por 0x400. O sea que elimina el BPX que antes había puesto. Realmente para esto bastaría con poner a 0 el bit #0 del DR7, pero de todas formas lo normal para eliminar los breakpoints es poner a 0 ese DR7. Aquí, el crackme activa el bit #10 (0x400 = 100 0000 0000) pero lo cierto es qué no sé el motivo ya que en el manual de Intel, los bits #10, #11, #12, #14 y #15 de este Debug Control Register no están descritos, lo cual me hace suponer que no tienen ninguna utilidad si bien es cierto que en la figura 16.1 de dicho manual el bit #10 aparece con un 1 mientras que los otros cuatro con 0. (http://i54.tinypic.com/24no2aa.jpg) Este es el código del manejador de excepciones que realmente es el corazón del crackme. Y eso es todo amigos, para cualquier duda u observación dejen un comentario a continuación. Gracias a todos por leer este "ladrillo" y sobre todo gracias al programador del crackme por tomarse su tiempo en la construcción del manejador de excepciones. Saludos. Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: .:UND3R:. en 23 Noviembre 2011, 14:42 pm Excelente tutorial :D, genial que hayas tocado detalladamente el uso que le da el crackme SEH instalado.
Saludos ;-) Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: karmany en 26 Noviembre 2011, 18:23 pm Excelente trabajo PeterPunk77.
Cierto, como dices, es que hacer un tutorial completo como has hecho requiere mucho tiempo. ¿Tú no estás entre los cinco ganadores? Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: Shamaroot en 26 Noviembre 2011, 19:12 pm Este tema de Cracking o Ingenieria Inversa lo encuentro super interesante pero aún no se programar y eso es clave. . . si, por mientras observare de lejos (pero sin perder distancia) ya que el tema me queda grande.
Saludos !! Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: PeterPunk77 en 26 Noviembre 2011, 19:12 pm ¿Tú no estás entre los cinco ganadores? Buenas karmany, no estoy entre los ganadores porque antes del sorteo se pusieron en contacto con todos nosotros para ver quien podría asistir. Y como el asunto era en Argentina y yo estoy al otro lado del charco rapidamente me desvinculé de todo.Lo cierto es que cuando lo solucioné ya sabía que no iba a ir, pero me gustó cómo estaba programado el manejador de excepciones del crackme y envié la solución para felicitar al programador. Un chico, muy majo por cierto, que me envió un correo para agradecerme las felicitaciones que le envié por el crackme. Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: .:UND3R:. en 27 Noviembre 2011, 02:43 am Este tema de Cracking o Ingenieria Inversa lo encuentro super interesante pero aún no se programar y eso es clave. . . si, por mientras observare de lejos (pero sin perder distancia) ya que el tema me queda grande. Saludos !! ERROR no requieres tener conocimientos de programación para iniciarte con Ingeniería inversa, pásate por el F.A.Q que te esperaremos, inmediatamente comienza con introducción al cracking desde cero, esperamos verte seguido, Saludos Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: Shamaroot en 27 Noviembre 2011, 05:45 am Citar ERROR no requieres tener conocimientos de programación para iniciarte con Ingeniería inversa, pásate por el F.A.Q que te esperaremos, inmediatamente comienza con introducción al cracking desde cero, esperamos verte seguido, Saludos Ehh mas bien, no quiero ir saltando etapas de momento primero me gustaria aprender a programar. . . Pero este tema lo tendre entre ceja y ceja :P (me pasare por lo me mencionas, gracias) Saludos !! Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: Иōҳ en 27 Noviembre 2011, 05:54 am No te estás saltando nada, la ing. inversa es muy independiente a que sepas programar o no....
Salu2 Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: .:UND3R:. en 27 Noviembre 2011, 16:13 pm Ehh mas bien, no quiero ir saltando etapas de momento primero me gustaria aprender a programar. . . Pero este tema lo tendre entre ceja y ceja :P (me pasare por lo me mencionas, gracias) Saludos !! Tal como comenta NOX. necesitamos gente y el requisito para empezar es leerse una introducción al cracking desde cero Saludos y cuentas con todo el subforo Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: Shamaroot en 27 Noviembre 2011, 17:05 pm ese
Citar necesitamos gente es para algo en particular? o es una manera de decir.haha de que me gusta me gusta cabros, pero quiero ir de a poco, es mas solo se prender el notebook :/ (pero no le perdere distancia) se agradece al apoyo :) Saludos !! Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: .:UND3R:. en 27 Noviembre 2011, 21:02 pm ese es para algo en particular? o es una manera de decir. haha de que me gusta me gusta cabros, pero quiero ir de a poco, es mas solo se prender el notebook :/ (pero no le perdere distancia) se agradece al apoyo :) Saludos !! Nada particular si no más gente que le guste aportar o que tenga dudas Saludos Título: Re: [Tutorial] Crackme de ESET para Ekoparty 2011 Publicado por: Shamaroot en 28 Noviembre 2011, 00:28 am ok gracias por el apollo ;)
De momento estoy ocupado con el estudio. . . Saludos !! |