<?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>48Bits Blog</title>
	<atom:link href="http://blog.48bits.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.48bits.com</link>
	<description>48Bits ... The one and a half architecture land.</description>
	<lastBuildDate>Mon, 08 Mar 2010 09:32:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A cualquier cosa la llaman herramienta</title>
		<link>http://blog.48bits.com/2010/03/08/a-cualquier-cosa-la-llaman-herramienta/</link>
		<comments>http://blog.48bits.com/2010/03/08/a-cualquier-cosa-la-llaman-herramienta/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 09:32:40 +0000</pubDate>
		<dc:creator>48bits</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/2010/03/08/a-cualquier-cosa-la-llaman-herramienta/</guid>
		<description><![CDATA[Ladies and gentlemen, señores y señoras, damas y caballeros, personas respetables en general&#8230; se han equivocado ustedes de página. Por favor sírvanse de presionar el botón de su navegador con forma de casita para abandonar lo antes posible este antro de perversión y degeneración. El resto de vosotros&#8230; seguidme.
Hoy vamos a visitar una de las [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.48bits.com/wp-content/uploads/2010/02/Zuhto.png"><img class="size-medium wp-image-1155 alignleft" title="Zuhto" src="http://blog.48bits.com/wp-content/uploads/2010/02/Zuhto-300x201.png" alt="" width="300" height="201" align="left" /></a>Ladies and gentlemen, señores y señoras, damas y caballeros, personas respetables en general&#8230; se han equivocado ustedes de página. Por favor sírvanse de presionar el botón de su navegador con forma de casita para abandonar lo antes posible este antro de perversión y degeneración. El resto de vosotros&#8230; seguidme.</p>
<p>Hoy vamos a visitar una de las alas recientemente inauguradas de este museo de los horrores que es 48Bits donde los depravados habitantes de esta web han recopilado todo aquel engendro que han creado en un momento un otro de su malograda vida, normalmente con fines oscuros.</p>
<p>La entrada la pueden encontrar sus mercedes si miran a la derecha de la página, la otra derecha campeones&#8230; sí, ESA derecha; en la parte de arriba de la columna, en la sección titulada &#8220;Páginas&#8221; en la cuarta posición&#8230; Cómo que te has perdido? Que qué es una sección? El baño? pero si no llevamos ni 5 minutos de&#8230; anda y que os follen a todash perracash del ashverno!</p>
<p>Y para los listillos que ya habían mirado por debajo de la puerta, que sepáis que hemos actualizado el <a href="http://blog.48bits.com/tools/" target="_self">contenido</a>.</p>
<p>No pienso volver a juntarme con gentuza como esta, me vuelvo a mi chamizo&#8230; argg</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/03/08/a-cualquier-cosa-la-llaman-herramienta/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Por los pelos&#8230;</title>
		<link>http://blog.48bits.com/2010/03/02/por-los-pelos/</link>
		<comments>http://blog.48bits.com/2010/03/02/por-los-pelos/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 17:16:24 +0000</pubDate>
		<dc:creator>Ruben Santamarta</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1164</guid>
		<description><![CDATA[Hace un par de años, estrenaba el blog de wintercore explicando una técnica para romper captchas de audio, y la demostraba rompiendo la de GMail. Tuvo cierta repercusión saliendo en portada de slashdot.org y eso. 
El caso es que tiempo después, me contactó alguien en nombre de una empresa &#8216;legal&#8217;(registrada) de Nevada(EEUU), usando para ello [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de años, estrenaba el blog de <a href="http://www.wintercore.com">wintercore</a> explicando una <a href="http://blog.wintercore.com/?p=11">técnica</a> para romper captchas de audio, y la demostraba rompiendo la de GMail. Tuvo cierta repercusión saliendo en portada de <a href="http://tech.slashdot.org/article.pl?sid=08/05/02/1426253">slashdot.org </a>y eso. </p>
<p>El caso es que tiempo después, me contactó alguien en nombre de una empresa &#8216;legal&#8217;(registrada) de <strong>Nevada</strong>(EEUU), usando para ello un email &#8220;puente&#8221; de un dominio registrado en Canada.</p>
<p>Me proponían una cosa curiosa&#8230;<br />
<span id="more-1164"></span></p>
<blockquote><p>
Hello,</p>
<p>I am interested in a solution to breaking reCaptcha&#8217;s audio captcha as<br />
found on Ticketmaster.com  I want to get 30% accuracy with 1 second or<br />
less processing time.  A programmer I have worked with previously has<br />
achieved 10% accuracy and under 1 second processing time.  If you<br />
provide consulting services that is also something we would be<br />
interested in.  Please contact me if you can do this project.</p>
<p>With Respect,<br />
&#8212;-
 </p></blockquote>
<p>Mi respuesta fue la siguiente</p>
<blockquote><p>Hello &#8212;&#8211;,</p>
<p>We have no reference about your company. We do not support any kind of illegal activies. Unless you can demonstrate that your company is a trusted entity we cannot going forward into this issue.</p>
<p>Regards.</p></blockquote>
<p>A lo que me respondió</p>
<blockquote><p>Hello,</p>
<p>My company is an established LLC in Nevada.  You should be able to verify that, but if not, I can help you figure out how to search the state records.  It is not illegal to have an automated way to decipher a captcha.  I hope we can discuss this matter further.</p>
<p>With Respect,</p></blockquote>
<p>&#8220;Quizá soy demasiado paranoico&#8221; pensé, asi que intenté ser más educado y ver qué había realmente detrás del tema.</p>
<blockquote><p>Hello,</p>
<p>Sorry if we were too rude but we receive, on a regular basis, requests to develop projects which are either barely legal or simply illegal.</p>
<p>You are right, there is nothing illegal in breaking a captcha, in fact as you probably know we released a method to do so. However, breaking captchas in an automated way is usually exploited to send unwanted emails and that kind of activities.</p>
<p>We do not want to be involved, neither directly nor indirectly, in those issues. We have no doubt that your company is legally registered, but our concerns are on the final usage of the technology we develop. Obviously, you are not required to disclose the purpose of your project but we need to verify that our work is not going to be used to harm users.</p>
<p>Regards.</p></blockquote>
<p>Esta fue su respuesta:</p>
<blockquote><p>No your work would not be used to harm users.  As you may know, the<br />
reCaptcha solution is one of the strongest available.  In particular,<br />
Ticketmaster&#8217;s is modified to be even stronger.  Our business is testing<br />
the strength of the captcha before implementing reCaptcha.  Your ability<br />
to break the captcha would lead us to try different methods.  This is<br />
all I can say on this matter.  I hope that is sufficient.</p>
<p>With Respect,</p></blockquote>
<p>Os confieso que estuve tentado de aceptar el reto, pero como este último mail cantaba mucho y no me inspiraba ninguna confianza decidí zanjar el tema.</p>
<blockquote><p>
Hello &#8212;-,</p>
<p>We have decided not to go further with this matter. Anyway thanks for writing.</p>
<p>Regards. </p></blockquote>
<p>Curiosamente mencioné esta &#8220;anécdota&#8221; en una entrevista recientemente. Pues bien, hace escasos minutos a través de twitter me llegó  esta noticia.<br />
<a href="http://www.nj.com/news/index.ssf/2010/03/wiseguy_tickets_is_accused_of.html">http://www.nj.com/news/index.ssf/2010/03/wiseguy_tickets_is_accused_of.html</a></p>
<p>Reconozco que me dió un pequeño vuelco el corazón,eran los mismos fulanos. Y se han comido todo el tinglado.</p>
<p>Si hubiera aceptado ahora mismo estaría camino de dormir con el polilla, finálmente.</p>
<p>Pase lo que pase, no hay que dejarse tentar por el dinero &#8220;fácil&#8221;. No se suele acabar bien.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/03/02/por-los-pelos/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>REconstruyendo código C en plataformas no x86 (MIPS, Parte I)</title>
		<link>http://blog.48bits.com/2010/02/25/reconstruyendo-codigo-c-en-plataformas-no-x86-mips-parte-i/</link>
		<comments>http://blog.48bits.com/2010/02/25/reconstruyendo-codigo-c-en-plataformas-no-x86-mips-parte-i/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 14:57:48 +0000</pubDate>
		<dc:creator>matalaz</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=985</guid>
		<description><![CDATA[Uno de los trabajos, en mi opinión, más coñazos es la recuperación/reconstrucción de código C a partir de un binario dado. Para x86 se tiene una muy buena opción como es Hex-Rays, pero no todo es x86, en muchos casos puede que querramos reconstruir un código C creado para una procesador MIPS para entender mejor un [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los trabajos, en mi opinión, más coñazos es la recuperación/reconstrucción de código C a partir de un binario dado. Para x86 se tiene una muy buena opción como es <a href="http://www.hex-rays.com/decompiler.shtml" target="_blank">Hex-Rays</a>, pero no todo es x86, en muchos casos puede que querramos reconstruir un código C creado para una procesador MIPS para entender mejor un algoritmo, copiarlo, extenderlo, etc&#8230; En esos casos en los que no tenemos un decompilador maravilloso que dando F5 &#8220;nos lo hace todo&#8221; auto-mágicamente no nos queda más remedio que hacerlo a manopla y el siguiente post se va a referir a estos casos. Yo me voy a basar en MIPS pero es perfectamente aplicable a cualquier otra plataforma de procesador, como por ejemplo ARM.<br />
<span id="more-985"></span></p>
<p><strong>Introducción</strong></p>
<p>Y ahora vamos al lío. Cuando voy a reconstruir código de un procesador nuevo estos son los pasos que yo sigo:</p>
<ul>
<li>Obtener los manuales oficiales del fabricante del procesador para aprender como funciona la arquitectura.</li>
<li>Crearme u obtener un compilador cruzado (GCC) para dicha arquitectura.</li>
<li>Crear códigos en C muy básicos para empezar a averiguar como se genera el código ensamblador, es decir, las construcciones más habituales.</li>
</ul>
<p>El tema de crear un compilador cruzado no es totalmente necesario pero si que ayuda mucho, porque de este modo sabemos exactamente como debe de quedar el resultado final y aprender a ajustarlo/corregirlo, especialmente si tenemos acceso al mismo compilador que se ha utilizado para compilar el binario a recuperar <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Sea como sea, lo que debemos de identificar y comprender como funciona son los siguientes aspectos y, en mi opinión, por este orden:</p>
<ol>
<li>Prólogos y epílogos de función.</li>
<li>Cómo se crean variables locales, de heap y globales (cómo se reserva memoria para las variables locales, etc&#8230;).</li>
<li>Cómo se llama a funciones y como se pasan los argumentos a dichas funciones (si existen diferentes convenciones de llamadas, como funciona cada una de ellas, como y cuando se arregla la pila en caso de ser utilizada, etc&#8230;).</li>
<li>Cómo se construyen las sentencias condicionales (IF &amp;&amp; ELSE).</li>
<li>Cómo se construyen los switches (al menos los más típicos).</li>
<li>Cómo se construyen los bucles (FOR y WHILE).</li>
</ol>
<p><strong>Muy breve introducción a la arquitectura MIPS</strong></p>
<p>Los procesadores MIPS son RISC (Reduced Instruction Set Computer) y existen versiones de 32 y 64 bits. Los registros que se utilizan son los siguientes (extraído del <a href="http://en.wikipedia.org/wiki/MIPS_architecture" target="_blank">artículo en wikipedia</a>):</p>
<table>
<tbody>
<tr>
<th>Name</th>
<th>Number</th>
<th>Use</th>
<th>Callee must preserve?</th>
</tr>
<tr>
<th>$zero</th>
<td>$0</td>
<td>constant 0</td>
<td>N/A</td>
</tr>
<tr>
<th>$at</th>
<td>$1</td>
<td>assembler temporary</td>
<td>No</td>
</tr>
<tr>
<th>$v0–$v1</th>
<td>$2–$3</td>
<td>values for function returns and expression evaluation</td>
<td>No</td>
</tr>
<tr>
<th>$a0–$a3</th>
<td>$4–$7</td>
<td>function arguments</td>
<td>No</td>
</tr>
<tr>
<th>$t0–$t7</th>
<td>$8–$15</td>
<td>temporaries</td>
<td>No</td>
</tr>
<tr>
<th>$s0–$s7</th>
<td>$16–$23</td>
<td>saved temporaries</td>
<td>Yes</td>
</tr>
<tr>
<th>$t8–$t9</th>
<td>$24–$25</td>
<td>temporaries</td>
<td>No</td>
</tr>
<tr>
<th>$k0–$k1</th>
<td>$26–$27</td>
<td>reserved for OS kernel</td>
<td>No</td>
</tr>
<tr>
<th>$gp</th>
<td>$28</td>
<td>global pointer</td>
<td>Yes</td>
</tr>
<tr>
<th>$sp</th>
<td>$29</td>
<td><a title="Stack-based memory allocation" href="http://en.wikipedia.org/wiki/Stack-based_memory_allocation">stack pointer</a></td>
<td>Yes</td>
</tr>
<tr>
<th>$fp</th>
<td>$30</td>
<td><a title="Frame pointer" href="http://en.wikipedia.org/wiki/Frame_pointer">frame pointer</a></td>
<td>Yes</td>
</tr>
<tr>
<th>$ra</th>
<td>$31</td>
<td><a title="Return statement" href="http://en.wikipedia.org/wiki/Return_statement">return address</a></td>
<td>N/A</td>
</tr>
</tbody>
</table>
<p>De esta tabla podemos aprender que los argumentos a funciones se suelen pasar por registro ($a0-$a3), que el stack pointer se representa por $sp, el frame pointer como $fp y la dirección de retorno como $ra. Además sabemos que registros del procesador son preservados cuando se llama a una función. Veamos ahora ya un código C básico y como queda su correspondiente código ensamblador:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> buf<span class="br0">&#91;</span><span class="nu0">20</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; strcpy<span class="br0">&#40;</span>buf, arg<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> **argv<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>argc &gt; <span class="nu0">1</span><span class="br0">&#41;</span> foo<span class="br0">&#40;</span>argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Y el siguiente es el código ensamblador generado por un compilador cruzado para MIPS Big Endian de 32 bits:</p>
<div class="dean_ch" style="white-space: wrap;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.globl foo<br />
foo: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # <span class="kw4">CODE</span> XREF: main<span class="nu0">+44</span>^Yp</p>
<p>var_20 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= -0&#215;20<br />
var_8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-8</span><br />
var_4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-4</span><br />
arg_0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &nbsp;<span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $sp, -0&#215;30<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Reservamos 0&#215;30 bytes para variables locales (stack)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$ra, 0&#215;30+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Guardamos la dirección de retorno en -4($sp)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$fp, 0&#215;30+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Guardamos el frame pointer en -8($sp)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$fp, $sp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $sp = $fp</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$a0, 0&#215;30+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $a0 = arg0; // Primer argumento a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $v0, $fp, 0&#215;30+var_20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Cargamos una variable estática local (addiu -&gt; variables locales de stack)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$a0, $v0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; arg0 = $v0; // El primer argumento a función ahora será la variable local</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$a1, 0&#215;30+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; arg1 = func_arg1; // El segundo argumento a función es el argumento recibido a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jal &nbsp; &nbsp; strcpy<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; strcpy(arg0, arg1);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span></div>
<div class="dean_ch" style="white-space: wrap;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;move &nbsp; &nbsp;$sp, $fp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$ra, 0&#215;30+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Restauramos la dirección de retorno</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$fp, 0&#215;30+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Restauramos el frame pointer</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $sp, 0&#215;30<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Arreglamos el stack</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jr &nbsp; &nbsp; &nbsp;$ra<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Y saltamos a la dirección de retorno</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span><br />
&nbsp;# <span class="kw4">End</span> of function foo</div>
<p>Con este código tan básico ya hemos aprendido lo siguiente:</p>
<ul>
<li>Cómo se pasan los argumentos a una función (registros $a0, $a1, etc&#8230;).</li>
<li>Cómo se reserva espacio para variables locales (addiu $sp, -0&#215;30) y cuanto espacio se reserva para variables locales, por lo cual, podemos saber el tamaño de las variables locales. Excluyendo el espacio utilizado para guardar la dirección de retorno ($ra) y el framepointer ($fp).</li>
</ul>
<p>El caso es que lo que se necesita identificar siempre, indiferentemente del procesador, es lo siguiente:</p>
<ul>
<li>Prólogo de la función para saber cuanto espacio se va a reservar para variables locales. También para saber que código hay que ignorar (el que no nos vale para reconstruir el código C).</li>
<li>Epílogo de la función (para saber hasta donde hay que decompilar, osea, que otra parte hay que ignorar).</li>
<li>Cómo se pasan los argumentos a función, como se llaman a las funciones y como se devuelve el valor retornado por la función llamada.</li>
</ul>
<p>Empecemos a generar código C para esta función. Lo primero, sabemos que los argumentos se reciben y se pasan vía $a<em>n.</em> También sabemos que para llamar a una función se utiliza la instrución JAL (Jump And Link) y que las variables de stack se reservan con ADDIU (Add Immediate Unsigned). El tamaño reservado para la única variable local es de 0&#215;20 tal y como nos lo muestra el IDA. De todos modos, en MIPS, se alinea todo a 8 bytes y, si lo necesitásemos, podemos sacar el espacio real reservado para variables restando 16 (decimal) al tamaño total que se reserva (0&#215;30-0&#215;10 = 0&#215;20). Bueno, ya sabemos todo lo que necesitamos para descompilar a manopla esta función tan simple, que queda como sigue:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">int</span> *arg1<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">int</span> var_20<span class="br0">&#91;</span>0&#215;20<span class="br0">&#93;</span>;<br />
&nbsp; &nbsp;strcpy<span class="br0">&#40;</span>var_20, arg1<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Este código que hemos creado, aunque perfectamente válido, no es el mismo código que ha escrito el programador ya que, por ejemplo, los tipos no coinciden. Viendo la función a la que se llama podemos sacar los tipos así que, corregimos la función:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg1<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> var_20<span class="br0">&#91;</span>0&#215;20<span class="br0">&#93;</span>;<br />
&nbsp; strcpy<span class="br0">&#40;</span>var_20, arg1<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Ahora es un poco más acertado el código <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  De hecho, quitando los nombres de variables, el código es exactamente el mismo excepto por otro leve detalle: El tamaño de la variable de stack no coincide. El motivo es que todo se alinea a 8 bytes y 20 (decimal) no es un tamaño divisible por 8 por lo que el compilador lo alinea, quedando el tamaño de la variable a otro diferente del que ha puesto el programador.</p>
<p>Vamos al siguiente ejemplo. En el anterior caso habíamos visto como se reservaba espacio para una variable de stack con un programita de juguete que tenía un overflow como una casa. Ahora vamos a ver ese mismo programa calcado pero con un puntero:</p>
<div class="dean_ch" style="white-space: wrap;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .globl foo<br />
foo:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# <span class="kw4">CODE</span>&nbsp;XREF: main<span class="nu0">+44</span>p</p>
<p>var_10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = -0&#215;10<br />
var_8&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-8</span><br />
var_4&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-4</span><br />
arg_0&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; = &nbsp;<span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu&nbsp; &nbsp;$sp, -0&#215;20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Reservamos 0&#215;20 bytes en la pila</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw&nbsp; &nbsp; &nbsp; $ra, 0&#215;20+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw&nbsp; &nbsp; &nbsp; $fp, 0&#215;20+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move&nbsp; &nbsp; $fp, $sp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Hasta aquí el prólogo, ya lo tenemos cazado <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw&nbsp; &nbsp; &nbsp; $a0, 0&#215;20+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw&nbsp; &nbsp; &nbsp; $a0, 0&#215;20+var_10<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Argumento 0 para llamada a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw&nbsp; &nbsp; &nbsp; $a1, 0&#215;20+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Argumento 1 para llamada a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jal&nbsp; &nbsp; &nbsp;strcpy<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Llamamos a strcpy(var_10, arg_0);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Desde aquí el epílogo, siguiente parte a ignorar por lo general</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move&nbsp; &nbsp; $sp, $fp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw&nbsp; &nbsp; &nbsp; $ra, 0&#215;20+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw&nbsp; &nbsp; &nbsp; $fp, 0&#215;20+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu&nbsp; &nbsp;$sp, 0&#215;20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jr&nbsp; &nbsp; &nbsp; $ra<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span><br />
&nbsp;# <span class="kw4">End</span> of function foo</div>
<p>Para reconstruir código, por lo general, tanto el prólogo como el epílogo nos dan un poco igual (nos interesa para saber cuanto espacio se reserva para variables locales y poco más), así que, ignoramos el prólogo y empezamos donde está el código que escribió el programador. En este caso, a diferencia del anterior, se carga la dirección de la variable &#8220;var_10&#8243; en el registro &#8220;$a0&#8243; (primer argumento a función) en vez de utilizar la instrucción ADDI (&#8220;add immediate&#8221;) como en el caso anterior, la instrucción LW es la utilizada para esta acción, lo cual nos indica que es un puntero. Después de esto, se establece arg_0 como el 2º argumento a función y se hace un &#8220;JUMP AND LINK&#8221; a la función strcpy. Con esto ya podemos reconstruir un poquito de código:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg_0<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> *var_10;<br />
&nbsp; strcpy<span class="br0">&#40;</span>var_10, arg_0<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Ala! Así de difícil ha sido esta vez. De momento ya sabemos identificar prólogos y epílogos, como se pasan argumentos a función así como identificar variables de stack y punteros. Lo que todavía no tenemos claro es como se retornan valores y demás. Vamos a ello:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">int</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg, <span class="kw4">int</span> size<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> buf<span class="br0">&#91;</span><span class="nu0">20</span><span class="br0">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; strncpy<span class="br0">&#40;</span>buf, arg, size<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> strlen<span class="br0">&#40;</span>buf<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>En esta función en C, copiamos un buffer con un tamaño máximo y devolvemos el tamaño de la cadena. Su código ensamblador MIPS sería el siguiente:</p>
<div class="dean_ch" style="white-space: wrap;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.globl foo<br />
foo: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # <span class="kw4">CODE</span> XREF: main+68p</p>
<p>var_20 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= -0&#215;20<br />
var_8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-8</span><br />
var_4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="nu0">-4</span><br />
arg_0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &nbsp;<span class="nu0">0</span><br />
arg_4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = &nbsp;<span class="nu0">4</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $sp, -0&#215;30<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Reserva de 0&#215;30 Bytes en la pila</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$ra, 0&#215;30+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$fp, 0&#215;30+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$fp, $sp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Fin del prólogo</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$a0, 0&#215;30+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sw &nbsp; &nbsp; &nbsp;$a1, 0&#215;30+arg_4<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$v1, 0&#215;30+arg_4<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $v1 -&gt; argumento a función 4</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $v0, $fp, 0&#215;30+var_20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $v0 -&gt; variable de stack var_20</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$a0, $v0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Ponemos var_20 como primer argumento a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$a1, 0&#215;30+arg_0<span class="br0">&#40;</span>$fp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; El segundo argumento a función es un puntero arg_0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$a2, $v1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $v1 se pone como tercer argumento a función</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jal &nbsp; &nbsp; strncpy<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Llamamos a strncpy(var_20, arg_0, arg_4);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $v0, $fp, 0&#215;30+var_20<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; $v0 = var_20</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$a0, $v0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Ponemos como primer argumento a función var_20</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jal &nbsp; &nbsp; strlen<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">; Llamamos a strlen(var_20);</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; Desde aquí el epílogo, podemos ignorarlo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; move &nbsp; &nbsp;$sp, $fp<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$ra, 0&#215;30+var_4<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lw &nbsp; &nbsp; &nbsp;$fp, 0&#215;30+var_8<span class="br0">&#40;</span>$sp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addiu &nbsp; $sp, 0&#215;30<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jr &nbsp; &nbsp; &nbsp;$ra<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">nop</span><br />
&nbsp;# <span class="kw4">End</span> of function foo</div>
<p>Ahora que vamos viendo como funciona esto podemos ver que, aunque hay más código, la diferencia no es para echar cohetes: Es más de lo mismo. Se reservan 0&#215;20 bytes de espacio para una variable de stack, se llama a la función strncpy pasándole 3 argumentos que son, respectivamente, la variable local, el primer argumento a función y el segundo argumento a función. Después, se llama a otra función (strlen) pasándole la variable de stack que habíamos creado antes. Después, simplemente restaura la pila y se pira de la función. Empecemos a crear pseudo-código aplicando ya los tipos que las funciones utilizadas nos indican que tienen que tener las variables y argumentos:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg0, <span class="kw4">int</span> arg4<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> var20<span class="br0">&#91;</span>0&#215;20<span class="br0">&#93;</span>;</p>
<p>&nbsp; strncpy<span class="br0">&#40;</span>var20, arg0, arg4<span class="br0">&#41;</span>;<br />
&nbsp; strlen<span class="br0">&#40;</span>var20<span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span></div>
<p>Este código es &#8220;casi&#8221; el que escribió el programador. ¿Qué es lo que falta aquí? ¿Qué es lo que no cuadra? Que se está llamando a una función (strlen) y no se hace nada con su valor de retorno. ¿O si se hace? Si volvemos a la tabla de registros que he puesto en la introducción del artículo vemos que el valor de retorno es guardado en $v0 así que, en $v0, es donde se deja el valor de retorno de una función. Pero, ¿Y dónde se está poniendo ese valor de retorno en nuestra función? Respuesta: En ninguna parte, es en la función strlen donde se está poniendo (de hecho, en los ejemplos anteriores, el valor de retorno es el de la última a llamada a una función). Sabido esto, ya podemos cambiar nuestro código C:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">int</span> foo<span class="br0">&#40;</span><span class="kw4">char</span> *arg0, <span class="kw4">int</span> arg4<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
<span class="kw4">char</span> var20<span class="br0">&#91;</span>0&#215;20<span class="br0">&#93;</span>;</p>
<p>&nbsp; strncpy<span class="br0">&#40;</span>var20, arg0, arg4<span class="br0">&#41;</span>;<br />
&nbsp; <span class="kw1">return</span><span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>var20<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Este código si que es &#8220;casi&#8221; exactemente el que escribió el programador, exceptuando temas cosméticos como indentaciones y nombres de variables, claro está.</p>
<p>Bueno, pues hasta aquí la parte I que ya se hace demasiado largo el post. En el siguiente, sentencias condicionales, bucles y switches. Espero que os haya gustado!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/02/25/reconstruyendo-codigo-c-en-plataformas-no-x86-mips-parte-i/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Debuggeando código JITeado de ActionScript</title>
		<link>http://blog.48bits.com/2010/02/15/debuggeando-codigo-jiteado-de-actionscript/</link>
		<comments>http://blog.48bits.com/2010/02/15/debuggeando-codigo-jiteado-de-actionscript/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 21:20:27 +0000</pubDate>
		<dc:creator>Ariel E. Coronel</dc:creator>
				<category><![CDATA[Ingeniería inversa]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1086</guid>
		<description><![CDATA[Luego de leer el paper presentado por Dionysus Blazakis en Black Hat DC 2010, me dieron ganas de ver un poco de que trata el rollo, pues sin tener conocimientos de como funciona ActionScript, nos la rebuscamos para debuggear con el Ollydbg el código JITeado de un ActionScript.


Herramientas a utilizar:
Ollydbg
IDA
Java JRE ( el compilador del [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->Luego de leer el paper presentado por Dionysus Blazakis en Black Hat DC 2010, me dieron ganas de ver un poco de que trata el rollo, pues sin tener conocimientos de como funciona ActionScript, nos la rebuscamos para debuggear con el Ollydbg el código JITeado de un ActionScript.</p>
<p><span id="more-1086"></span><br />
<!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		A:link { so-language: zxx } --></p>
<p><strong>Herramientas a utilizar:</strong></p>
<p>Ollydbg<br />
IDA<br />
Java JRE ( el compilador del redtamarin es un jar )<br />
redtamarin ( <a href="http://code.google.com/p/redtamarin">http://code.google.com/p/redtamarin</a> )<br />
Alchemy ( <a href="http://labs.adobe.com/downloads/alchemy.html">http://labs.adobe.com/downloads/alchemy.html</a> )<br />
Process explorer o task manager <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->En su blog hace tiempo escribió una entrada llamada “Getting Pointers from Leaky Interpreters&#8221;, en la que explica como armando diccionarios de hash tables, se puede obtener un puntero hacia nuestro código.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->En ese post, el mostró un ejemplo hecho en actionscript que en ese momento no supo como compilarlo como SWF, pero menciono que compilador estaba utilizando a la hora de sus pruebas.<br />
Nuestro objetivo sera crear un SWF con un texto al estilo “Hola mundo”, y algunos XORs asi probamos que tan bien nos va identificando el código.</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p><strong>Primer paso: Herramientas.</strong></p>
<p>Para poder generar nuestro swf a partir de un archivo .as ( actionscript ), necesitaremos descargar el redtamarin y el Alchemy.<br />
El redtamarin es el compilador ( asc.jar ) que utilizaremos para nuestro actionscript, el Alchemynos dara la lib playerglobal.abc.<br />
Copiaremos este ultimo file dentro del folder del tamarin como primer paso.</p>
<p><strong>Segundo paso: example.as</strong></p>
<div class="dean_ch" style="white-space: wrap;">package <span class="br0">&#123;</span></p>
<p><span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">*</span>;<br />
<span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="me1">*</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">class</span> example <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span><br />
<span class="kw3">public</span> <span class="kw2">function</span> example<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">var</span> <span class="kw3">text</span> = <span class="kw2">new</span> <span class="kw3">TextField</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="kw3">text</span>.<span class="kw3">width</span> = <span class="nu0">400</span>;<br />
<span class="kw3">text</span>.<span class="me1">x</span> = <span class="nu0">0</span>;<br />
<span class="kw3">text</span>.<span class="me1">y</span> = <span class="nu0">0</span>;<br />
<span class="kw3">text</span>.<span class="kw3">text</span> = <span class="st0">&#8216;looking for help&#8217;</span>;<br />
addChild<span class="br0">&#40;</span><span class="kw3">text</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->Creo que no hace falta describir que hace esto xD</p>
<p><strong>Tercer paso: Hacer nuestro swf !</strong></p>
<p>Para generar un swf a partir de nuestro example.as iremos al cmd y ejecutaremos el asc.jar de la siguiente manera:</p>
<blockquote><p>java -jar asc.jar -swf example,400,400 -import builtin.abc -import playerglobal.abc example.as</p></blockquote>
<p>Lo único a comentar aquí es que el parámetro swf tiene como parámetros: classname,width,height.</p>
<p>El resultado de la ejecución en nuestro caso es: example.swf, 645 bytes written</p>
<p>Para ver nuestro swf podemos simplemente volcarlo dentro de nuestro navegador, o hacer algún simple html que lo cargue:</p>
<div class="dean_ch" style="white-space: wrap;">
&lt;object width=&quot;550&quot; height=&quot;400&quot;&gt;<br />
&lt;param name=&quot;movie&quot; value=&quot;example.swf&quot;&gt;<br />
&lt;embed src=&quot;example.swf&quot; width=&quot;550&quot; height=&quot;400&quot;&gt;<br />
&lt;/embed&gt;<br />
&lt;/object&gt;</div>
<p><a href="http://blog.48bits.com/wp-content/uploads/2010/02/Screenshot-1.png"><img class="size-medium wp-image-1095" title="example" src="http://blog.48bits.com/wp-content/uploads/2010/02/Screenshot-1-300x124.png" alt="" width="300" height="124" /></a></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->Vemos que va bien.. ahora le agregamos un simple while(true) para que podamos usarlo para encontrar el código JITeado.</p>
<div class="dean_ch" style="white-space: wrap;">
package <span class="br0">&#123;</span></p>
<p><span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">*</span>;<br />
<span class="kw3">import</span> flash.<span class="kw3">text</span>.<span class="me1">*</span>;</p>
<p><span class="kw3">public</span> <span class="kw2">class</span> example <span class="kw3">extends</span> Sprite <span class="br0">&#123;</span><br />
<span class="kw3">public</span> <span class="kw2">function</span> example<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">var</span> <span class="kw3">text</span> = <span class="kw2">new</span> <span class="kw3">TextField</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
<span class="kw3">text</span>.<span class="kw3">width</span> = <span class="nu0">400</span>;<br />
<span class="kw3">text</span>.<span class="me1">x</span> = <span class="nu0">0</span>;<br />
<span class="kw3">text</span>.<span class="me1">y</span> = <span class="nu0">0</span>;<br />
<span class="kw3">text</span>.<span class="kw3">text</span> = <span class="st0">&#8216;looking for help&#8217;</span>;<br />
addChild<span class="br0">&#40;</span><span class="kw3">text</span><span class="br0">&#41;</span>;<br />
<span class="kw1">while</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;<br />
<span class="kw2">var</span> a = <span class="br0">&#40;</span>0xAAAAAAAA ^ 0xBBBBBBBB ^ 0xCCCCCCCC ^ 0xDDDDDDDD <span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->Aprovechamos y también le agregamos algunos valores para que los xoree, y de paso ver si lo podemos identificar en el debugger mientras vamos traceando. <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><strong>Cuarto paso: Debuggear el codigo JITeado.</strong></p>
<p>Abrimos nuestro html, y antes de cargar el swf nos pide permiso para ejecutarlo, aquí nos attacheareamos con el Olly al IE8 en nuestro caso y veremos mínimo dos procesos del iexplore.exe corriendo, vamos a attacheanos al que tiene como window name  Sysfader.</p>
<p>El taskmanager o el process explorer lo dejaremos minimizado al tray asi podemos estimar que cuando entramos al loop infinito en nuestro código JITeado.</p>
<p>Le daremos Run al Olly, parara algunas veces en memory breakpoints en el flash10b pero nosotros seguiremos hasta que no tire excepciones y el cpu este como mencionamos anteriormente trabajando de manera constante al 100% ( en caso de que sea single core ), en este momento pausamos el proceso.</p>
<p>Iremos a la ventana de Threads, y buscaremos el nuestro que estará en el heap, ya que  la mayoría van a estar parados en la ntdll sera sencillo encontrar el único thread diferente.</p>
<p>Aquí pueden pasar dos cosas: la primera es que no estemos en el loop infinito, entonces empezaremos de 0 nuevamente, o bien puede ocurrir que encontremos el thread parado en el heap como en este caso:</p>
<p><a href="http://blog.48bits.com/wp-content/uploads/2010/02/threads.png"><img class="alignnone size-medium wp-image-1098" title="threads" src="http://blog.48bits.com/wp-content/uploads/2010/02/threads-300x223.png" alt="" width="300" height="223" /></a></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } -->Ahora veamos el codigo algo mas completo:</p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<div class="dean_ch" style="white-space: wrap;">
&lt;span style=<span class="st0">&quot;font-size: x-small;&quot;</span>&gt;019C01E1 <span class="kw1">MOV</span> <span class="kw3">EAX</span>,<span class="kw5">DWORD</span> <span class="kw4">PTR</span> <span class="kw3">DS</span>:<span class="br0">&#91;</span>25EB0D8<span class="br0">&#93;</span><br />
019C01E7 <span class="kw1">TEST</span> <span class="kw3">EAX</span>,<span class="kw3">EAX</span><br />
019C01E9 <span class="kw1">JNZ</span> 019C025F<br />
019C01EF <span class="kw1">MOV</span> <span class="kw3">EAX</span>,<span class="nu0">1</span><br />
019C01F4 <span class="kw1">TEST</span> <span class="kw3">EAX</span>,<span class="kw3">EAX</span><br />
019C01F6 <span class="kw1">JNZ</span> 019C01E1<br />
019C01FC PREFIX <span class="kw1">REPNE</span>:<br />
019C01FD MOVUPS XMM0,DQWORD <span class="kw4">PTR</span> <span class="kw3">DS</span>:<span class="br0">&#91;</span>25815E0<span class="br0">&#93;</span><br />
019C0204 PREFIX <span class="kw1">REPNE</span>:<br />
019C0205 MOVUPS XMM1,DQWORD <span class="kw4">PTR</span> <span class="kw3">DS</span>:<span class="br0">&#91;</span>25815E8<span class="br0">&#93;</span><br />
019C020C PREFIX <span class="kw1">REPNE</span>:<br />
019C020D MOVUPS DQWORD <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>EBP-2C<span class="br0">&#93;</span>,XMM1<br />
019C0211 PREFIX <span class="kw1">REPNE</span>:<br />
019C0212 MOVUPS DQWORD <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>ESP<span class="nu0">-8</span><span class="br0">&#93;</span>,XMM0<br />
019C0217 <span class="kw1">SUB</span> <span class="kw3">ESP</span>,<span class="nu0">8</span><br />
019C021A <span class="kw1">CALL</span> Flash10d.101F1C30<br />
019C021F <span class="kw1">ADD</span> <span class="kw3">ESP</span>,<span class="nu0">8</span><br />
019C0222 <span class="kw1">MOV</span> <span class="kw3">EBX</span>,<span class="kw3">EAX</span><br />
019C0224 <span class="kw1">PUSH</span> <span class="kw5">DWORD</span> <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>EBP<span class="nu0">-28</span><span class="br0">&#93;</span><br />
019C0227 <span class="kw1">PUSH</span> <span class="kw5">DWORD</span> <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>EBP-2C<span class="br0">&#93;</span><br />
019C022A <span class="kw1">CALL</span> Flash10d.101F1C30<br />
019C022F <span class="kw1">ADD</span> <span class="kw3">ESP</span>,<span class="nu0">8</span><br />
&lt;strong&gt;019C0232 <span class="kw1">XOR</span> <span class="kw3">EBX</span>,EAX&lt;/strong&gt;<br />
019C0234 PREFIX <span class="kw1">REPNE</span>:<br />
019C0235 MOVUPS XMM0,DQWORD <span class="kw4">PTR</span> <span class="kw3">DS</span>:<span class="br0">&#91;</span>25815F0<span class="br0">&#93;</span><br />
019C023C PREFIX <span class="kw1">REPNE</span>:<br />
019C023D MOVUPS DQWORD <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>ESP<span class="nu0">-8</span><span class="br0">&#93;</span>,XMM0<br />
019C0242 <span class="kw1">SUB</span> <span class="kw3">ESP</span>,<span class="nu0">8</span><br />
019C0245 <span class="kw1">CALL</span> Flash10d.101F1C30<br />
019C024A <span class="kw1">ADD</span> <span class="kw3">ESP</span>,<span class="nu0">8</span>&lt;strong&gt;<br />
019C024D <span class="kw1">XOR</span> <span class="kw3">EBX</span>,<span class="kw3">EAX</span><br />
019C024F <span class="kw1">XOR</span> <span class="kw3">EBX</span>,DDDDDDDD&lt;/strong&gt;&lt;strong&gt; <span class="co1">; It looks familiar right ? <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span><br />
019C0255 <span class="kw1">MOV</span> <span class="kw3">EAX</span>,<span class="nu0">4</span><br />
019C025A <span class="kw1">JMP</span> 019C0267<br />
019C025F <span class="kw1">MOV</span> <span class="kw3">ECX</span>,<span class="kw5">DWORD</span> <span class="kw4">PTR</span> <span class="kw3">SS</span>:<span class="br0">&#91;</span>EBP<span class="nu0">+8</span><span class="br0">&#93;</span><br />
019C0262 <span class="kw1">CALL</span> Flash10d.1020E410&lt;/span&gt;</div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p><strong>Quinto paso: Automatizando con un script</strong></p>
<p>Hay varios caminos para tomar a la hora de llegar a donde empieza realmente nuestro código JITeado, adjunto un simple ODbgScript que mediante hardware breakpoints en VirtualProtect nos guiara hacia la presa <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Ejecutarlo una vez que tira la primer excepción como explicamos mas arriba en el posteo.</p>
<div class="dean_ch" style="white-space: wrap;">
; Get_my_JITed_AS.<span class="me1">osc</span> by sick</p>
<p>var cont<br />
var address<br />
var VirtualProtect</p>
<p>mov cont, <span class="nu0">0</span><br />
gpa <span class="st0">&quot;VirtualProtect&quot;</span>, <span class="st0">&quot;kernel32.dll&quot;</span><br />
mov VirtualProtect, $RESULT<br />
bphws VirtualProtect, <span class="st0">&quot;x&quot;</span></p>
<p>gogo:<br />
erun</p>
<p>cooking:<br />
eob SALCHICHACONPURE</p>
<p>SALCHICHACONPURE:<br />
cmp eip, VirtualProtect<br />
je vptect<br />
cmp eip, address<br />
je isdone<br />
jmp gogo</p>
<p>vptect:<br />
cmp <span class="br0">&#91;</span>esp<span class="nu0">+8</span><span class="br0">&#93;</span>, <span class="nu0">100</span><br />
jb gogo<br />
mov address, <span class="br0">&#91;</span>esp<span class="nu0">+4</span><span class="br0">&#93;</span><br />
bphws address, <span class="st0">&quot;x&quot;</span><br />
jmp gogo</p>
<p>isdone:<br />
inc cont<br />
cmp cont, <span class="nu0">1</span><br />
mov address2, address<br />
je gogo</p>
<p>add address, <span class="nu0">60</span><br />
bphws address, <span class="st0">&quot;x&quot;</span><br />
cmp cont, <span class="nu0">2</span><br />
je gogo</div>
<p>De aquí en mas pueden agregarle código a su Actionscript y seguir jugando <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Se agradece a Acid y Gera que colaboraron con el debugging del engine de Flash.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/02/15/debuggeando-codigo-jiteado-de-actionscript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jobs llega a 48bits</title>
		<link>http://blog.48bits.com/2010/02/05/jobs-llega-a-48bits/</link>
		<comments>http://blog.48bits.com/2010/02/05/jobs-llega-a-48bits/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 11:19:16 +0000</pubDate>
		<dc:creator>48bits</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1048</guid>
		<description><![CDATA[
Pero sin iPad ni iPod, ni siquiera es Steve Jobs. Es un servicio que ofrecemos a la &#8220;comunidad&#8221; esperando que pueda ser útil para alguien, en éstos tiempos tan jodidos que estamos viviendo.
http://jobs.48bits.com es un apartado dedicado exclusivamente a ofertas de trabajo que estén relacionadas con la seguridad informática, en mayor o menor medida.
48bits tiene [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.48bits.com/wp-content/uploads/2010/02/NeedsYou.png"><img class="aligncenter size-full wp-image-990" title="NeedsYou" src="http://blog.48bits.com/wp-content/uploads/2010/02/NeedsYou.png" alt="" width="400" height="400" /></a></p>
<p>Pero sin iPad ni iPod, ni siquiera es Steve Jobs. Es un servicio que ofrecemos a la &#8220;comunidad&#8221; esperando que pueda ser útil para alguien, en éstos tiempos tan jodidos que estamos viviendo.</p>
<p><a href="http://jobs.48bits.com" target="_Blank"><span style="text-decoration: underline;">http://jobs.48bits.com</span></a> es un apartado dedicado exclusivamente a ofertas de trabajo que estén relacionadas con la seguridad informática, en mayor o menor medida.</p>
<p>48bits tiene una media de 1000 visitas únicas al día, incluyendo mucha gente técnica, por lo que es un lugar ideal para dar a conocer aquellos puestos que requieren habilidades &#8220;no habituales&#8221;.</p>
<p>Dejar claro que nuestro objetivo con esto es facilitar que jóvenes, o no tan jóvenes, encuentren un puesto de trabajo. Por ello no buscamos un beneficio económico, este servicio es totalmente GRATUITO para las empresas.</p>
<p>Todas las empresas que deseen insertar  sus ofertas de trabajo en 48bits, o publicar cualquier tipo de información laboral de interés para la comunidad, nos pueden escribir a <strong>jobs(at)48bits(dot)com</strong>.</p>
<p>Si tienes dudas acerca de los términos de la  publicación de la oferta de trabajo, escríbenos sin dudarlo.</p>
<p>Suerte!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2010/02/05/jobs-llega-a-48bits/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
