<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DisidentS Team &#187; crackme</title>
	<atom:link href="http://www.disidents.org/tag/crackme/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.disidents.org</link>
	<description>-= Sharing Knowledge since 1996! =- Seguridad, Ingeniería Inversa, Redes, Programación, Noticias</description>
	<lastBuildDate>Fri, 03 Sep 2010 13:10:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CutedEvil Crackme #1 (Old Session &#8211; 2002)</title>
		<link>http://www.disidents.org/2009/04/05/cutedevil-crackme-1-old-session-2002/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cutedevil-crackme-1-old-session-2002</link>
		<comments>http://www.disidents.org/2009/04/05/cutedevil-crackme-1-old-session-2002/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 01:44:50 +0000</pubDate>
		<dc:creator>spark</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Spark - @rroba]]></category>
		<category><![CDATA[@rroba]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[crackme]]></category>
		<category><![CDATA[cutedevil]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[Reversing Links]]></category>
		<category><![CDATA[SparK]]></category>
		<category><![CDATA[SparKrisp]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=127</guid>
		<description><![CDATA[  CuTedEvil CrackMe #1 Análisis y Parcheo.   Buenas, a todos los lectores de @rroba, soy SparK, del team DisidentS, y les ofrezco mis nobles y humildes conocimientos en este arte de la Ingeniería Inversa. Espero que se diviertan tanto como yo lo he hecho con este crackme, en realidad no es nada difícil, pero [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p align="CENTER"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-large;">CuTedEvil CrackMe #1</span></span></p>
<p align="CENTER"><span style="font-family: Arial, sans-serif;"><span style="font-size: large;"><span style="text-decoration: underline;">Análisis y Parcheo.</span></span></span></p>
<p align="CENTER"> </p>
<p align="JUSTIFY"><span style="font-family: Arial;">Buenas, a todos los lectores de @rroba, soy SparK, del team DisidentS, y les ofrezco mis nobles y humildes conocimientos en este arte de la Ingeniería Inversa.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Espero que se diviertan tanto como yo lo he hecho con este crackme, en realidad no es nada difícil, pero a veces es lindo acorralar fácilmente a una víctima o no? <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Quizás algunos de ustedes sean avezados Reverser&#8217;s y piensen al leerme, ¿pero que es esto? ¿El abecedario una y otra vez?, quizás otros novatos newbies, o simplemente lectores interesados en este arte digan: “mmmm, interesante”, quiero que sepan todos ustedes, intentaré darles siempre pensamientos frescos e ideas nuevas, por eso es bello este arte, es muy diverso.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Pero, vamos por partes, dijo Jack el Destripador, ¿Qué es un Crackme?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, para los que no lo saben, un crackme es un programita que sirve para ejecitarse en el arte de la ingeniería inversa, en pocas palabras, es un “ejercicio de aplicación”.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">¿ Que lograremos crackeando un crackme?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Pues, muchísimas cosas, primero, hay crackmes con las mas diversas protecciones y ocurrencias, en síntesis sirve para poder aprender, concentrarse en ese código difícil de aprender e interpretar a simple vista llamado Ensamblador, para poder memorizar técnicas, rutinas,  y luego, en otro momento cuando miremos otro código digamos, “ah!, es mas o menos parecido a&#8230;” , en fin, ejercitas, la lógica, la memoria, y a la vez si no sabes o no entiendes ni medio de lo que pasa en ese maldito crackme, <strong>aprendes</strong>, que es lo más importante que te puede suceder aquí.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Les daré mas pistas, existen muchos tipos de ejercicios de aplicación, algunos de ellos son los Reverse me&#8217;s, los Tool me&#8217;s y demás, los primeros debes conocer ensamblador a fondo, y reprogramar la aplicación, o inclusive agregar código faltante, ¿ interesante no ? , ya veremos algunos, no desesperéis&#8230;. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Este Crackme, lo he bajado de <a href="http://www.crackmes.de/">www.crackmes.de</a> , y hasta hoy no tenía solución.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">El crackme, tiene un aspecto como una caja de registro típica de cualquier programa, deberemos ingresar Nombre de Usuario, Serial, y luego click en Check.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Si hacemos click en Read the Rulez!, nos dirá que debemos programar un keygen, ok, ¿que es eso? Un programa que genere seriales aceptables para el crackme, ingresandole cualquier nombre de usuario, para poder hacer esto debemos conocer y entender que sucede dentro del crackme y como se calcula el serial a partir de un nombre de usuario dado.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, empecemos parcheándolo, ¿porque? ,  pues porque no tenemos que analizar mucho para parchearlo, aunque no este permitido en las reglas del juego, lo haré para explicarles a los más novatillos como se debe hacer.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial">Les comento algo a todos, parchear es nocivo para la mente del cracker, se dice que es un sucio crack, aquel que pudiendo aplicar técnicas mas “finas”,  parchea, ¿ porque ?, porque aquí queremos aprender, y el facilismo nos lleva a la mediocridad, entonces, si parcheamos, es fácil crackearlo, como verán solo cambiando uno o dos bytes, pero si hacemos un serial fishing, y aún muchísimo mejor , programamos una keygen, estamos demostrandonos sobre todo, que sabemos bien lo que sucede en nuestra querida pc, y que podemos entender tarde o temprano, lo que sea. Aunque si no está a nuestros alcances hacer un keygen aún, paciencia, parchear es divertido <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Carguemos el Olly, (¿que porque olly?, porque me anda muy bien en mi win xp), y ejecutemoslo, presionando F9, ¿que sucede?, aparece nuestro programilla, ponemos un nombre de usuario, SparK, ahora un serial, 0123456, y click en Check, que sucede?&#8230;&#8230;&#8230; NADA!</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, se dice en el Zen Cracking, que todo cracker necesita una referencia para penetrar en el código de un programa, los seres humanos, tenemos referencias, los objetos los identificamos con los sentidos, son distintos, son reconocibles, en el cracking sucede lo mismo, el cracker necesita un punto de referencia, al principio los novatos necesitan puntos de referencia mas “humanos”, pero luego, te acostumbras al lenguaje interno de las máquinas y empiezas a encontrar referencias que antes no veías, esto , se llama práctica.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Nuestro punto de referencia, aquí sería un cartel, llamado messagebox que diga “Incorrect Serial” o algo por el estilo, entonces, nosotros desensamblaríamos el programa, y buscaríamos donde se llama a ese messagebox y un poco antes encontraríamos el salto que nos lleva al cartel exitoso o al fracaso, simplemente invertirlo y PUM!, “You are registered”.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial">Pero no, no soñemos mas, enfrentemos la realidad, no hay messagebox, no nos dice nada, pero tampoco nos registra y eso nos pone mal, muy mal. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Ok, busquemos en el Olly, por alguna referencia de strings, miremos un poquito más abajo y encontramos algo como esto:</span></p>
<p style="text-align: center; " align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura1.jpg"><img class="aligncenter size-thumbnail wp-image-135" title="figura11" src="http://www.disidents.org/wp-content/uploads/2009/04/figura11-150x150.jpg" alt="figura11" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Perfecto!, algunas referencias hemos encontrado, miren esta,  &#8220;Congratulations, you cracked this program <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;, miremos mas arriba de esta referencia, y encontramos este salto:</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">004012E8  |. 74 0F          |JE SHORT CuTedEvi.004012F9</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Bien, si invertimos ese salto, tendríamos que estar registrados, probemos cambiar el 74 por un 75 (JNE), hagamos click sobre la instrucción de salto, presionemos la tecla espaciadora, y ahora, cambiemos el JE por un JNE, y listo, apretemos F9, ¿¿que pasa?? nada, sigue haciendo lo mismo, ¿pero que pasa aqui?</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Seguramente existe lo que se llama, mirror check, es un chequeo primario o secundario, que se hace en otra parte del código, que seguramente chequea longitud del nombre de usuario, del serial ingresado, o algun cálculo con ellos posterior, miremos un poco más, ¿ven porque no es bueno parchear a lo bruto?, si no conoces el código y lo haces mecánicamente, puedes quedar mal parado ante una demostración ;oD</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">¿Pero, como encontrar el otro chequeo?, miremos, observermos, debugiemos el código, una y otra vez, pongamos breakpoints, haber, ¿ que sucede generalmente en estas rutinas a nivel interno para obtener los textos introducidos por el usuario?, una pista, referencia, aparentemente oculta, pero existe, generalmente se llama a la API GetDlgItemText, o GetDlgItemTextA, para obtener el texto, pues ¿que hace?, obtiene el texto del editbox del nombre de usuario por ejemplo, y pone en el registro EAX la longitud del texto introducido.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Busquemos la/las llamadas a esta hermosa API&#8230;..</span></p>
<p align="JUSTIFY"><span style="font-family: Arial; ">Aquí hay algo interesante:</span></p>
<p style="text-align: center;" align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura2.jpg"><img class="aligncenter size-thumbnail wp-image-136" title="figura21" src="http://www.disidents.org/wp-content/uploads/2009/04/figura21-150x150.jpg" alt="figura21" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ok, tenemos en 0040115B que carga el ID de uno de los editbox, seguramente el del nombre de usuario, y en</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">0040117E, el ID del serial, ahora 00401166 y en 00401191 es llamada la API mencionada.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;">Fijense algo curioso, luego de llamarlas a las APIs encontramos lo siguiente:</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">0040118E  	CMP EAX,0</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> 00401191  	JE CuTedEvi.0040132B</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Recuerden que les conté en secreto que GetDlgItemTextA, devuelve en EAX la longitud del texto extraído de una editbox, entonces, aquí compara la longitud con 0 y si es 0, salta a otro lado, con lo que no iría por buen camino, ya que nosotros debemos ingresar un serial y un nombre de usuario, sino no chequeará nada y seguirá su rumbo&#8230;..</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Existe otra API llamada lstrlenA, que justamente obtiene la longitud de una string. ¿ pero porque esta llamada aquí ?, si ya sabemos cuanto tiene cada string&#8230; quiere decir, que debe necesitarlo, miremos:</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">PUSH CuTedEvi.0040332B                   	; /String = &#8220;&#8221;</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> CALL &lt;JMP.&amp;KERNEL32.lstrlenA&gt;           ; \lstrlenA</span></p>
<p align="JUSTIFY"><span style="font-family: Arial"> CMP EAX,0</span></p>
<p align="JUSTIFY"><span style="font-family: Arial"> JE SHORT CuTedEvi.004012F7 </span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">De nuevo un chequeo por 0, y salta a donde el otro chequeo lo hace, 004012F7, como podemos ver, ese salto, es por donde NO debemos ir.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial, sans-serif;"><span style="font-size: x-small;">Bien, pensemos ahora, que sucede, ¿si no salta a 004012F7?, algo hace, algo debe hacer, y de hecho lo hace&#8230;</span></span></p>
<p style="text-align: center;" align="JUSTIFY"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura31.jpg"><img class="aligncenter size-thumbnail wp-image-138" title="figura31" src="http://www.disidents.org/wp-content/uploads/2009/04/figura31-150x150.jpg" alt="figura31" width="150" height="150" /></a></p>
<p align="JUSTIFY"><span style="font-family: Arial;">ROL es una instrucción de cálculo, rota los bits hacia la izquierda, hagamos de cuenta que multiplicamos por 5 (en decimal) un valor.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">SUB resta 123 (en hexadecimal).</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">ADD suma 321 (en hexa también)</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">CMP compara con un valor, en este caso 2FE.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Luego si, no es EAX ese valor esperado, salta al famoso <em>salto del fracaso</em>. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"><span style="text-decoration: underline;">Apliquemos Ingeniería Inversa:</span></span></p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"><span style="font-family: Arial;">el valor esperado en eax como resultado de los cálculos es 2FE (33 en decimal), en EAX, tenemos la longitud de la cadena serial luego de llamar a lstrlenA, entonces, hagamos el cálculo inverso para ver, que longitud necesitamos tener en el editbox serial.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Tomemos 2FE, restemosle 321, esto nos da un número negativo FFFFFFFFFFFFFFDD, ahora sumemos 123, y nos da 100 (siempre en hexadecimal, no se confundan), ahora ROL multiplica por 5, ahora DIVIDAMOS por 5, ¿¿ y que obtenemos ?? un lindo y hermoso <strong>33</strong><span>.</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Esa, esa cifra señores, es la longitud que el programa necesita que tenga el serial, para poder seguir chequeando.</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ahora , modifiquemos el valor del serial, y miremos, que pasa: 012345678901234567890123456789012 , ese serial introduje yo, 33 valores cualquiera ni más, ni menos&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">Ahora miremos que estamos muy cerca de los cartelitos de antes, ¿se acuerdan?, ok, les muestro que pasa antes:</span></p>
<p style="text-align: center;" align="JUSTIFY"><span style="font-family: Arial;"><a href="http://www.disidents.org/wp-content/uploads/2009/04/figura4.jpg"><img class="aligncenter size-thumbnail wp-image-139" title="figura41" src="http://www.disidents.org/wp-content/uploads/2009/04/figura41-150x150.jpg" alt="figura41" width="150" height="150" /></a><br />
</span></p>
<p align="JUSTIFY">Ok, tenemos el salto que habíamos parcheado hoy, pero, con la diferencia que sabemos que pasa antes, ahora solamente lo que podemos hacer son dos cosas, o introducir un número cualquiera de 33 caracteres, y luego parchear ese salto, o sino, parchear los dos saltos:</p>
<p>Primero: 		<span style="font-family: Arial;"><span>CMP EAX,2FE</span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> JNZ SHORT CuTedEvi.004012F7</span></p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">Segundo:		<span style="font-family: Arial;"><span style="font-size: x-small;"><span><span>CMP BL,0</span></span></span></p>
<p align="JUSTIFY"><span style="font-family: Arial;"> JE SHORT CuTedEvi.004012F9</span></p>
<p align="JUSTIFY"><span style="font-family: Arial;">y Listo!, felicidades lo has logrado. <img src='http://www.disidents.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
 <span class="post2pdf_span" style="border: 1px solid gray; width: 160px; text-align: left; "><a href="http://www.disidents.org/wp-content/plugins/post2pdf/generate.php?post=" rel="nofollow"><img src="http://www.disidents.org/wp-content/plugins/post2pdf/icon/pdf.png" width="16px" height="16px" />convert this post to pdf.</a></span>]]></content:encoded>
			<wfw:commentRss>http://www.disidents.org/2009/04/05/cutedevil-crackme-1-old-session-2002/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
