<?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; Hispasec</title>
	<atom:link href="http://www.disidents.org/tag/hispasec/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>Solucionando un CrackME de Hispasec!</title>
		<link>http://www.disidents.org/2009/01/20/solucioncrackinghispasec/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=solucioncrackinghispasec</link>
		<comments>http://www.disidents.org/2009/01/20/solucioncrackinghispasec/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 10:35:10 +0000</pubDate>
		<dc:creator>noukeys</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[Desafío]]></category>
		<category><![CDATA[Hispasec]]></category>
		<category><![CDATA[Ingeniería Inversa]]></category>
		<category><![CDATA[noukeys]]></category>
		<category><![CDATA[Reto Hispasec]]></category>

		<guid isPermaLink="false">http://www.disidents.org/?p=38</guid>
		<description><![CDATA[  En el presente escrito se abordará la resolución del CrackME de hispasec, llamado a partir de ahora crackme o reto, detallando las siguientes partes.  ¿Qué se pretende?  Encontrando la zona de interés.  Análisis del algoritmo.  Generación de un fichero válido.  Fallos de diseño.  Despedida y cierre.   El crackme y el fichero de licencia [...]]]></description>
			<content:encoded><![CDATA[<p>  En el presente escrito se abordará la resolución del CrackME de hispasec, llamado a partir de ahora crackme o reto, detallando las siguientes partes.</p>
<ul type="disc">
<li class="MsoNormal"> ¿Qué se pretende?</li>
<li class="MsoNormal"> Encontrando la zona de interés.</li>
<li class="MsoNormal"> Análisis del algoritmo.</li>
<li class="MsoNormal"> Generación de un fichero válido.</li>
<li class="MsoNormal"> Fallos de diseño.</li>
<li class="MsoNormal"> Despedida y cierre.</li>
</ul>
<p>   El crackme y el fichero de licencia lo podeis encontrar en el siguiente enlace.</p>
<ul>
<li><a title="This external link will open in a new window" href="http://rapidshare.com/files/183931546/Ficheros.rar.html" target="_blank">CrackME!</a></li>
</ul>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">1.- ¿Qué se pretende?</td>
</tr>
</tbody>
</table>
<p>   El objetivo de este reto, es generar un fichero de licencia válido y explicar los fallos de diseño encontrados en los hilos. Quiero comentar que en este documento encontraremos lo que a mi juicio son fallos de diseño, no tienen porque coincidir con los criterios de los autores del reto.  Para la resolución de este reto se ha utilizado un depurador y un editor hexadecimal, en mi caso he optado por Ollydbg y por Hex Workshop.      </p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">2.- Encontrando la zona de interés.</td>
</tr>
</tbody>
</table>
<p>   Para llegar a la zona que nos interesa analizar, y sabiendo de antemano que necesitamos un fichero de licencia, tenemos varia maneras de abordar nuestro cometido; explicaré un par de ellas.</p>
<ul type="disc">
<li class="MsoNormal"> Localizando la función de chequeo mediante referencias a cadenas.</li>
</ul>
<p>Nada más cargar nuestro reto en el depurador, parados en el oep, buscamos referencias a cadenas con search for &gt; All referenced text strings. Obtenemos esto.</p>
<p style="text-align: center; " align="center"><img class="aligncenter size-full wp-image-56" title="img1nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img1nk.jpg" alt="img1nk" width="498" height="74" /></p>
<p>Podemos ver las cadenas &#8220;crackem.lic&#8221;, &#8220;Good job!&#8221; y &#8220;Keep trying&#8221;, es evidente que nuestro objetivo es &#8220;Good job&#8221;. Seguimos la cadena y caemos en este punto.  <img class="aligncenter size-full wp-image-57" title="img2nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img2nk.jpg" alt="img2nk" width="545" height="76" />  </p>
<p class="MsoNormal"><span lang="ES">En función de un par de comparaciones carga una de las cadenas. Seguimos el código hacia arriba, para ver donde se inicia esta función.</span></p>
<p class="MsoNormal"><span lang="ES"><img class="aligncenter size-full wp-image-58" title="img3nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img3nk.jpg" alt="img3nk" width="578" height="130" /></span></p>
<p class="MsoNormal"><span lang="ES">Aquí encontramos el inicio de la función, en la dirección 004010B0, vamos a fijarnos un momento que llama a la API CreateFileA, pero el atributo Mode es OPEN_EXISTING. </span><span>Esto es importante para el siguiente punto.</span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Localizando      la función de chequeo utilizando la API de Windows.</span></li>
</ul>
<p> </p>
<p class="MsoNormal"><span lang="ES">Ahora vamos a utilizar la API de Windows para llegar al mismo punto. Nada más cargar nuestro reto en el depurador, parados en el oep, buscamos referencias a APIs cargadas con search for &gt; Name (label) in current module. </span><span>Obtenemos esto.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-59" title="img4nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img4nk.jpg" alt="img4nk" width="418" height="232" /></span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span lang="ES">Vamos a poner un BP en cada API específica de ficheros.</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">KERNEL32.CreateFileA</p>
<p class="MsoNormal">KERNEL32.GetFileSize</p>
<p class="MsoNormal">KERNEL32.GetFileType</p>
<p class="MsoNormal">KERNEL32.ReadFile</p>
<p class="MsoNormal">KERNEL32.WriteFile</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"><span lang="ES">Ejecutamos varias veces y vemos unas cuantas paradas antes de llegar a este BP en la dirección 004010CB, tal como vemos en esta imagen.</span></p>
<p class="MsoNormal"><span lang="ES"><img class="aligncenter size-full wp-image-60" title="img5nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img5nk.jpg" alt="img5nk" width="480" height="72" /></span></p>
<p class="MsoNormal"><span lang="ES">Seguimos el código hacia arriba, para ver donde se inicia esta función. </span><span>Encontramos el inicio en la dirección 004010B0.</span></p>
<p class="MsoNormal"><span> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>3.- Análisis del algoritmo.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Como ya hemos localizado la función de chequeo, ahora vamos a centrarnos en analizarla.</span></p>
<p class="MsoNormal"><span lang="ES">La función comprueba que existe el fichero &#8220;<em>crackme.lic&#8221; </em>, mira el tamaño del fichero, crea un buffer para guardar los datos, vuelca el contenido del fichero en el buffer creado, lanza los hilos que comprueban si los datos que hemos volcado son válidos y analiza el resultado de los hilos para decidir que cadena muestra. </span><span>Esto corresponde al siguiente esquema.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-61" title="img6nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img6nk.jpg" alt="img6nk" width="261" height="776" /></span></p>
<p class="MsoNormal"><span lang="ES">Bueno, lo realmente interesante esta en los hilos de ejecución, así que vamos a ver que es lo que hacen los mismos. Vamos a fijarnos en el argumento Thread Function, vemos que tiene el parámetro 00401000, este es el inicio de la función que ejecuta el hilo.</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal" style="text-align: center;"><img class="aligncenter size-full wp-image-84" title="img7nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img7nk.jpg" alt="img7nk" width="486" height="262" /></p>
<p class="MsoNormal"><span lang="ES">Los bytes del fichero llave deben ser menores de 0Ah, es decir menores de 10d, si el hilo encuentra un byte igual a FFh, termina el análisis. Si nos fijamos, la función tiene dos salidas, una en la que realiza un &#8220;XOR EAX,EAX&#8221; o lo que es lo mismo, poner EAX a 0; y otra que realiza un &#8220;MOV EAX,1&#8243; o lo que es lo mismo, poner EAX a 1.</span></p>
<p class="MsoNormal"><span lang="ES">¿Cómo conseguimos poner EAX a 1?, si solucionamos esta pregunta, tenemos solucionado el problema; para conseguir la ejecución de ese salto, debemos lograr que el resultado de AL tras la ejecución del código sea igual a 09h. </span><span>Veamos más claramente la ejecución.</span></p>
<p class="MsoNormal"><span><img class="aligncenter size-full wp-image-63" title="img8nk" src="http://www.disidents.org/wp-content/uploads/2009/01/img8nk.jpg" alt="img8nk" width="253" height="498" /></span></p>
<p class="MsoNormal"><span lang="ES">El proceso le el primer byte del fichero, carga otro byte que utiliza para los cálculos, vamos a llamarlo byte auxiliar o aux; este byte, al principio va a estar a 0. Tras esto realiza una operación con este byte, aux = aux + 4*aux, esto lo guarda en edx. Carga en bl el dato leído del fichero y este dato junto con aux, lo utiliza para acceder a una tabla de bytes; el calculo es el siguiente desplazamiento = dato + aux * 2.</span></p>
<p class="MsoNormal"><span lang="ES">En nuestro caso necesitamos un desplazamiento de 48h, si no conseguimos cargar el 09h, el byte apuntado se convierte en el nuevo aux. </span><span>Y esto se repite hasta encontrar FFh.</span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span lang="ES">4.- Generación de un fichero válido.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Bueno, conociendo el algoritmo, es fácil generar un fichero válido, solo necesitamos conocer la tabla de bytes que hemos comentado anteriormente. Es la siguiente (las cabeceras de la tabla están representadas en decimal.).</span></p>
<p class="MsoNormal"><span>1 .- Bytes hexadecimales.</span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" width="376">
<tbody>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><span> </span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>0</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>1</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>2</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>3</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>4</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>5</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>6</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>7</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>8</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>9</span></strong></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>0</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>10</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>20</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>30</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>40</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>01</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>02</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>03</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>50</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>04</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>05</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>00</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>60</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>06</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>70</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>09</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
</tr>
<tr>
<td width="32">
<p class="MsoNormal" align="center"><strong><span>80</span></strong></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>08</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal" align="center"><span>07</span></p>
</td>
<td width="32">
<p class="MsoNormal"><span>  07</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Necesitamos conseguir un desplazamiento de 72d bytes. Para ello vamos a realizar las siguientes operaciones.</span></p>
<p class="MsoNormal"><span lang="ES">Aux = 0 (la primera pasada del algoritmo).</span></p>
<p class="MsoNormal"><span lang="ES">Data = 06 (Primer byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">0 + 0*4 = 0.</span></p>
<p class="MsoNormal"><span lang="ES">6 + 0*2 = 6.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 6; el 04.</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 04.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 07 (Segundo byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">4 + 4*4 = 20.</span></p>
<p class="MsoNormal"><span lang="ES">7 + 20*2 = 47.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 46; el 08.</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por lo tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 08.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 01 (Tercer byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">8 + 8*4 = 40.</span></p>
<p class="MsoNormal"><span lang="ES">1 + 40*2 = 81</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 81; el 07;</span></p>
<p class="MsoNormal"><span lang="ES">No es 09, por lo tanto lo usamos como nuevo aux.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Aux = 07.</span></p>
<p class="MsoNormal"><span lang="ES">Data = 02 (Cuarto byte del fichero).</span></p>
<p class="MsoNormal"><span lang="ES">7 + 7*4 = 35.</span></p>
<p class="MsoNormal"><span lang="ES">02 + 35*2 = 72.</span></p>
<p class="MsoNormal"><span lang="ES">Cargamos el byte que hay con desplazamiento 72; el 09.</span></p>
<p class="MsoNormal"><span lang="ES">Es 09, por lo tanto terminamos en el return que nos interesa.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<p class="MsoNormal"><span lang="ES">Si nos fijamos, el segundo hilo, utiliza exactamente la segunda función, además, la tabla de bytes no es modificada, por tanto, sólo tenemos que duplicar la cadena de bytes obtenida anteriormente y replicarla. Al final, añadimos el byte de fin que utiliza el programa, el FFh.</span></p>
<p class="MsoNormal"><span lang="ES">La cadena de bytes que necesitamos escribir para generar un fichero válido es la siguiente: <em>&#8220;0607010206070102FF&#8221;</em>. Esto lo podemos hacer con nuestro editor hexadecimal preferido. Una vez realizado esto, tenemos solucionado este reto.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>5.- Fallos de diseño.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">A continuación, comento lo que <span style="text-decoration: underline;">a mi juicio</span> son fallos de diseño en el algoritmo.</span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Existe      un fragmento de código, que no es necesario para la resolución del reto,</span></li>
</ul>
<p class="MsoNormal"><span>00401070   .  68 CE070000   push 7CE</span></p>
<p class="MsoNormal"><span>00401075   .  FFD6                call esi                                 ;  kernel32.Sleep</span></p>
<p class="MsoNormal"><span>00401077   .  EB 04               jmp short crackme.0040107D</span></p>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span>0040107D   &gt; \E8 67010000  call crackme.004011E9</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401082   .  99                     cdq</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401083   .  B9 32000000   mov ecx,32</span></p>
<p class="MsoNormal"><span lang="EN-GB">00401088   .  F7F9                idiv ecx</span></p>
<p class="MsoNormal"><span>0040108A   .  52                    push edx</span></p>
<p class="MsoNormal"><span lang="EN-GB">0040108B   .  FFD6               call esi                                 ;  kernel32.Sleep</span></p>
<p class="MsoNormal"><span lang="EN-GB"> </span></p>
<p class="MsoNormal"><span lang="ES">Si se ha utilizado a modo de código basura, debería de repartirse más por la función o diseñarse de alguna otra manera ya que es muy obvio comprobar que no es necesario analizarlo para la resolución del reto.</span></p>
<p class="MsoNormal"><span lang="ES"> </span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Los      dos hilos que se lanzan para comprobar el fichero llave, utilizan la misma      función y esta hace exactamente lo miso. Podríamos haber solucionado esto      utilizando por ejemplo dos puntos de entrada para la función o una      modificación de la misma. Otra opción hubiese sido utilizar otra función      que comprobase otras propiedades del los bytes del fichero.</span></li>
</ul>
<p class="MsoNormal"><span lang="ES"> </span></p>
<ul type="disc">
<li class="MsoNormal"><span lang="ES"> Al      utilizar el segundo hilo para chequear los bytes del fichero, si no hemos      modificado la función ni hemos utilizado otra función distinta, al menos      deberíamos haber cambiado la tabla de bytes para forzar un nuevo cálculo      de la segunda parte de los bytes del fichero.</span></li>
</ul>
<p class="MsoNormal"><span lang="ES"> </span></p>
<table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">
<p class="MsoNormal"><strong><span>6.- Despedida y cierre.</span></strong></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><span> </span></p>
<p class="MsoNormal"><span lang="ES">Un Saludo a los miembros de Disidents.org, al canal #crackers, a thEpOpE, a NoMuRyTo y a toda la gente que me dejo pero sabe que puede darse por saludada. Espero que no seais muy duros en las críticas de mi primera publicación.</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/01/20/solucioncrackinghispasec/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
