<?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>Diario de un programador &#187; Sin categoria</title>
	<atom:link href="http://blog.cuerty.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cuerty.com</link>
	<description>Historias, pensamientos, ideas y proyectos de un programador viviendo en Buenos Aires, Argentina.</description>
	<lastBuildDate>Wed, 16 Jun 2010 20:38:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Reverse engineer en OSX &#8211; Parte I</title>
		<link>http://blog.cuerty.com/2010/06/16/181/</link>
		<comments>http://blog.cuerty.com/2010/06/16/181/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 06:18:35 +0000</pubDate>
		<dc:creator>Fz</dc:creator>
				<category><![CDATA[Sin categoria]]></category>
		<category><![CDATA[cracking]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[reverse-engineer]]></category>

		<guid isPermaLink="false">http://blog.cuerty.com/?p=181</guid>
		<description><![CDATA[
.entry a { color: blue; }

Como verán, quien escribe no es quién esperan que escriba. Me tomé el atrevimiento de intrometerme en el blog de mi amigo @cuerty y dejarles una serie de posts para los switchers que se compraron una mac.
I. Introducción
Voy a hacer algunas entregas de una introducción a reverse engineer en OSX, [...]]]></description>
			<content:encoded><![CDATA[<style>
.entry a { color: blue; }
</style>
<p>Como verán, quien escribe no es quién esperan que escriba. Me tomé el atrevimiento de intrometerme en el blog de mi amigo @cuerty y dejarles una serie de posts para los switchers que se compraron una mac.</p>
<h2>I. Introducción</h2>
<p>Voy a hacer algunas entregas de una introducción a reverse engineer en OSX, siempre asm x86 32-bit. Mi idea es intentar desviar un poco la atención de la teoría (Que ya fue repetida hasta el hartazgo) y hacer un enfoque mas práctico: Voy a presentar una serie de crackme&#8217;s que bajé de otro sitio y explicar qué puede hacerse.</p>
<h2>II. Requerimientos</h2>
<p>Para mas o menos entender de qué viene el asunto, es necesario:</p>
<ul>
<li>Entender la sintaxis de Objective-C</li>
<li>Conocer mas o menos los comandos básicos de gdb</li>
<li>Estar familiarizado con la sintaxis Intel de asm.</li>
</ul>
<h2>II. b. Herramientas</h2>
<ul>
<li><a href="http://developer.apple.com/technologies/xcode.html">gdb</a></li>
<li><a href="http://otx.osxninja.com/files/otx.dmg">otx</a></li>
<li><a href="http://www.codethecode.com/download/class-dump-3.3.2.dmg">class-dump</a></li>
<li>Dado que OSX usa Mach-O que puede tener muchas arquitecturas, los offsets están corridos. Para solucionar esto pueden usar <a href="http://dl.dropbox.com/u/623010/offset.py">este script que hice</a></li>
</ul>
<h2>III. Lo básico.</h2>
<p>Entender asm es fundamental para poder seguir adelante y a partir de este momento voy a asumir que esto último es un hecho.</p>
<p>Dicho esto, voy a recordar dos cosas: La primera es esta tabla de optcodes muy util (http://ref.x86asm.net/coder32.html) y la segunda la representación de los registros completos y parciales:</p>
<table style="font-family: Arial, sans-serif; font-size: small; margin-top: 2em; margin-right: 0px; margin-bottom: 2em; margin-left: 4em; border-collapse: collapse; background-color: #eee; line-height: normal; padding: 0px; border: 1px solid #000000;" border="0">
<tbody style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<th style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; text-align: center; background-color: #e0e0e0; margin: 0px; border: 1px solid #000000;">Bits 31 &#8211; 24</th>
<th style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; text-align: center; background-color: #e0e0e0; margin: 0px; border: 1px solid #000000;">Bits 23 &#8211; 16</th>
<th style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; text-align: center; background-color: #e0e0e0; margin: 0px; border: 1px solid #000000;">Bits 15 &#8211; 8</th>
<th style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; text-align: center; background-color: #e0e0e0; margin: 0px; border: 1px solid #000000;">Bits 7 &#8211; 0</th>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">eax</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ax</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ah</code></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">al</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ebx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">bx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">bh</code></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">bl</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ecx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">cx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ch</code></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">cl</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">edx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">dx</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">dh</code></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">dl</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">ebp</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">bp</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">esp</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">sp</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">esi</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">si</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="4"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">edi</code></td>
</tr>
<tr style="font-family: Arial, sans-serif; font-size: small; padding: 0px; margin: 0px;">
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"></td>
<td style="font-family: Arial, sans-serif; font-size: small; padding-top: 0px; padding-right: 1em; padding-bottom: 0px; padding-left: 1em; vertical-align: top; text-align: center; margin: 0px; border: 1px solid #000000;" colspan="2"><code style="font-family: 'Lucida Console', monospace; font-size: small; padding: 0px; margin: 0px;">di</code></td>
</tr>
</tbody>
</table>
<h2>III b. ¿¡ Objective-Qué !?</h2>
<p>Antes de empezar voy a hacer una brevísima introducción a la sintaxis de Objective-C.</p>
<p>Objective-C es un superset de C que provee programación orientada a objetos y conceptos de Messaging al estilo Smalltalk. Actualmente podemos compilar objective-c usando gcc.</p>
<h3>¿Cómo se vé un hello world en Objective-C?</h3>
<p>Normalmente tiene (Al igual que C) un archivo con los headers (.h) y otro con la implementación (.m), sin embargo no se parecen en nada a la sintaxis de C. Objective-C usa &#8220;interfaces&#8221; que vamos a llamar incorrectamente y para simplificarlo: &#8220;clases&#8221;.</p>
<p>Nuestro HelloWorld.h se vería:</p>
<pre class="prettyprint">@interface HelloWorld : NSObject

- (void)imprimirFrase:(NSString *)frase

@end</pre>
<p>Esto puede traducirse a: La clase HelloWorld hereda de NSObject y tiene un método imprimirFrase que devuelve void y recibe un parámetro NSString.</p>
<p>Nuestro HelloWorld.m sería:</p>
<pre class="prettyprint">#import "HelloWorld.h"

@implementation HelloWorld

- (void)imprimirFrase:(NSString *)frase
{
	NSLog(@"%@", frase);
}

@end</pre>
<p>Si quisiera llamar a esta función debería hacer:</p>
<pre class="prettyprint">HelloWorld *hola = [[HelloWorld alloc] init];
[hola imprimirFrase:@"Hola mundo!"];
[hola release];</pre>
<p>Como dije antes cuando hablamos de Objective-C no hacemos &#8220;llamadas a funciones&#8221; (A menos que sea una llamada a una función de C/C++) sino que &#8220;enviamos mensajes&#8221;. La sintaxis es esta:</p>
<p><strong>[&lt;objeto&gt; &lt;método&gt;:&lt;argumento_1&gt; &lt;nombre_argumento_2&gt;:&lt;argumento_2&gt;....];</strong></p>
<h3>¿Y cómo funciona este envío de mensajes?</h3>
<p>Lo primero que podemos ver es que los binarios están linkeados a libobjc.A.dylib. Por ahora lo único que vamos a ver de esta librería es una función que se llama &#8220;objc_msgSend&#8221;.</p>
<p>objc_msgSend es lo que el superset usa internamente para &#8220;enviar los mensajes&#8221; que vimos anteriormente. Esto es importante porque lo vamos a utilizar todo el tiempo en los análisis.</p>
<p>La función tiene esta declaración:</p>
<pre class="prettyprint">id objc_msgSend(id theReceiver, SEL theSelector, ...)</pre>
<p>Devuelve un id (&#8221;id&#8221; es un puntero a objc_class que a su vez es un struct. Quizás en el siguiente tutorial entre en detalles sobre esto) y recibe como parámetros:</p>
<ol>
<li>El objeto que recibe el mensaje</li>
<li>El método (SEL es un objc_selector, que a su vez es un (char *). SEL se utiliza en Objective-C para llamar a funciones dinámicamente en runtime).</li>
<li>Los siguientes parámetros son los argumentos del método.</li>
</ol>
<h2>IV. A los bifes, #1 Crack me.</h2>
<ul>
<li>El archivo se puede bajár de acá: <a href="http://reverse.put.as/wp-content/uploads/2010/05/SmellsGood.zip">SmellsGood</a></li>
</ul>
<p>Voy a explicar un caso muy intuitivo; que no necesita mucho análisis y parece bastante straight forward, no obstante voy a pasar siempre por los mismos pasos:</p>
<ul>
<li>Recolección de información.</li>
<li>Análisis de la información</li>
<li>Debugging</li>
<li>Cracking</li>
</ul>
<h3>Recolección de información</h3>
<p>En esta primera etapa lo que vamos a hacer es recolectar todo lo necesario para entender qué sucede en la app y qué podemos hacer.</p>
<p>Lo primero que vay a hacer es desensamblarlo[0]. Para eso voy a usar otx, esta aplicación (otool eXtended) es muy similar a otool pero con un output mucho mas prolijo, optcodes, offsets y lo que es mejor: El nombre de los métodos.</p>
<p>Entonces:</p>
<pre>$ otx SmellGood.app &gt; SmellGood.asm</pre>
<p>De esta manera tenemos en SmellGood.asm nuestra aplicación desensamblada. Ahora le toca el turno al class-dump. Lo que vamos a hacer en el siguiente paso es *intentar* hacer un dump de las definiciones de las clases usadas en SmellGood. El output debería ser similar a un .h de Objective-C con las interfaces.</p>
<pre>$ class-dump SmellGood.app &gt; SmellGood.h</pre>
<h3>Análisis de la información</h3>
<p>Lo siguiente que voy a hacer es tratar de entender qué está sucediendo.</p>
<p>En el .h podemos ver qué métodos nos interesan tanto para entender qué sucede como para empezar a poner break-points. Nuestro caso es este:</p>
<pre class="prettyprint">- (void)check:(id)arg1;
- (BOOL)checkCode:(id)arg1 forName:(id)arg2;
- (id)generateCodeForName:(id)arg1;
- (id)digest:(id)arg1;
- (id)shuffle:(id)arg1;</pre>
<p>Sin mucho análisis podemos ver que:</p>
<ul>
<li>El código depende del nombre.</li>
<li>Hay un &#8220;digest&#8221; (¿md5?, ¿sha1?)</li>
<li>Hay un shuffle</li>
</ul>
<p>Ahora hagamos un análisis mas serio desde el assembler. Lo primero que vamos a ver es el método <strong>-(BOOL)[SmellsGood_AppDelegate checkCode:forName:]</strong>:</p>
<pre class="prettyprint"> +30	00002b18	e855250000	calll	0x00005072		-[(%esp,1) componentsSeparatedByString:]
 +35	00002b1d	8b150c400000	movl	0x0000400c,%edx		count
 +41	00002b23	89542404	movl	%edx,0x04(%esp)
 +45	00002b27	890424		movl	%eax,(%esp)
 +48	00002b2a	e843250000	calll	0x00005072		-[(%esp,1) count]
 +53	00002b2f	83f805		cmpl	$0x05,%eax
 +56	00002b32	754c		jne	0x00002b80
 +58	00002b34	a110400000	movl	0x00004010,%eax		uppercaseString
 +63	00002b39	891c24		movl	%ebx,(%esp)
 +66	00002b3c	89442404	movl	%eax,0x04(%esp)
 +70	00002b40	e82d250000	calll	0x00005072		-[(%esp,1) uppercaseString]
 +75	00002b45	89c3		movl	%eax,%ebx
 +77	00002b47	8b4514		movl	0x14(%ebp),%eax
 +80	00002b4a	89442408	movl	%eax,0x08(%esp)
 +84	00002b4e	a114400000	movl	0x00004014,%eax		generateCodeForName:
 +89	00002b53	89442404	movl	%eax,0x04(%esp)
 +93	00002b57	8b4508		movl	0x08(%ebp),%eax
 +96	00002b5a	890424		movl	%eax,(%esp)
 +99	00002b5d	e810250000	calll	0x00005072		-[(%esp,1) generateCodeForName:]
+104	00002b62	891c24		movl	%ebx,(%esp)
+107	00002b65	89442408	movl	%eax,0x08(%esp)
+111	00002b69	a118400000	movl	0x00004018,%eax		isEqualToString:
+116	00002b6e	89442404	movl	%eax,0x04(%esp)
+120	00002b72	e8fb240000	calll	0x00005072		-[(%esp,1) isEqualToString:]
+125	00002b77	ba01000000	movl	$0x00000001,%edx
+130	00002b7c	84c0		testb	%al,%al
+132	00002b7e	7502		jne	0x00002b82
+134	00002b80	31d2		xorl	%edx,%edx
+136	00002b82	83c414		addl	$0x14,%esp
+139	00002b85	89d0		movl	%edx,%eax
+141	00002b87	5b		popl	%ebx
+142	00002b88	c9		leave
+143	00002b89	c3		ret</pre>
<p>Bueno, este es un caso que está clarísimo, incluso sin debuggearlo. No voy a detenerme en esta parte, ya que tiene demasiada meta-data. Lo que voy a hacer es traducir esto que vimos a un código que esté bastante cerca al que suponemos habrá sido el original:</p>
<pre class="prettyprint">-(BOOL)SmellsGood_AppDelegate checkCode:(NSString *)code forName:(NSString *)name
{
	if ([[code componentsSeparatedByString:@"-"] count] != 5) return NO;

	NSString *_code = [self generateCodeForName:[name uppercaseString]];
	if ([_code isEqualToString:code])
		return YES;
	else
		return NO;
}</pre>
<p>¿Bastante facil no?. Lo mismo podemos hacer con generateCodeForName:.</p>
<pre class="prettyprint">-(NSString *)generateCodeForName:(NSString *)name
{
	NSArray *data = [[self digest:[name dataUsingEncoding:4]] componentsSeparatedByString:@" "];
	return [[[self shuffle:data] componentsJoinedByString:@"-"] uppercaseString];
}</pre>
<p>Por cierto, ese &#8220;4&#8243; ahí es del enum NSStringEncoding, en este caso NSUTF8StringEncoding = 4,</p>
<p>Y nuevamente podríamos hacer algo similar con shuffle, pero voy a cambiar de estrategia para que sea mas divertido.</p>
<p>Veamos el asm, separé las partes que nos importan:</p>
<pre class="prettyprint">+17	00002d0e  c744240800000000	movl	$0x00000000,0x08(%esp)
...
+40	00002d25  e848230000		calll	0x00005072			-[(%esp,1) objectAtIndex:]

+48	00002d2d  c744240802000000	movl	$0x00000002,0x08(%esp)
...
+68	00002d41  e82c230000		calll	0x00005072			-[(%esp,1) objectAtIndex:]

+76	00002d49  c744240801000000	movl	$0x00000001,0x08(%esp)
...
+96	00002d5d  e810230000		calll	0x00005072			-[(%esp,1) objectAtIndex:]

+104	00002d65  c744240803000000	movl	$0x00000003,0x08(%esp)
...
+123	00002d78  e8f5220000		calll	0x00005072			-[(%esp,1) objectAtIndex:]

+131	00002d80  c744240804000000	movl	$0x00000004,0x08(%esp)
...
+150	00002d93  e8da220000		calll	0x00005072			-[(%esp,1) objectAtIndex:]</pre>
<p>Bueno, ahí está bastante claro. Si recuerdan lo que dije de objc_msgSend no es dificil entender lo que sucede: Al principio está poniendo en el esp + 0&#215;08 el número 0 (Recordemos que: esp tiene el objeto, +0&#215;04 tiene un (char *) con el método y a partir de ahí los argumentos).</p>
<p>En resumen lo que está pasando acá es:</p>
<pre class="prettyprint">[array objectAtIndex:0];
[array objectAtIndex:2];
[array objectAtIndex:1];
[array objectAtIndex:3];
[array objectAtIndex:4];</pre>
<p>Por otro lado sin mucho análisis uno puede deducir que el digest hace un <strong>sha1</strong> (De nuevo, solo mirando el nombre de los métodos).</p>
<h3>Debugging</h3>
<p>Bueno, a decir verdad ya tenemos tanta información que no necesitamos mucho debugging. Este paso lo vamos a hacer mas en profundidad en otros crackme&#8217;s. Voy a hacer solamente una comprobación. ¿Se acuerdan en el primer código que hay un if que pregunta si el codigo ingresado es el mismo al generateCodeForName: ?. Bueno, vamos a localizarlo, para que se entienda lo que sucede. Según el .asm lo tenemos acá:</p>
<pre class="prettyprint">+130	00002b7c  84c0		testb	%al,%al
+132	00002b7e  7502		jne	0x00002b82</pre>
<p>Corremos el gdb con el filename de nuestra app en el primer argumento.</p>
<pre>$ gdb SmellsGood.app
GNU gdb 6.3.50-20050815 (Apple version gdb-1461) (Wed Dec 23 06:11:18 UTC 2009)
...</pre>
<p>Seteamos un breakpoint en checkCode:forName:</p>
<pre>gdb$ break checkCode:forName:
Breakpoint 1 at 0x2b01</pre>
<p>Corremos el programa.</p>
<pre>gdb$ run</pre>
<p>Ahora tocamos en el botón de &#8220;check&#8221;.</p>
<pre class="prettyprint">Breakpoint 1, 0x00002b01 in -[SmellsGood_AppDelegate checkCode:forName:] ()
gdb$ disas
Dump of assembler code for function -[SmellsGood_AppDelegate checkCode:forName:]:
(...)
0x00002b7c <-[SmellsGood_AppDelegate checkCode:forName:]+130>:	test   al,al
0x00002b7e <-[SmellsGood_AppDelegate checkCode:forName:]+132>:	jne    0x2b82 <-[SmellsGood_AppDelegate checkCode:forName:]+136>
(...)</pre>
<p>Bien, supongamos que queremos saber qué devuelve ese isEqualToString. (Asumamos por un segundo que sabemos que devuelve &#8220;false&#8221;&#8230; nota: Nunca asumir nada), podemos tomar muchos approaches de como encarar el patch, que vamos a analizar en el siguiente punto. Uno de ellos sería hacer que eso devuelva siempre &#8220;true&#8221; (o cambiar ese jne a un je). Veamos lo que devuelve esa función:</p>
<pre class="prettyprint"># Seguimos haciendo stepping hasta llegar a 0x00002b72 (Según lo que vimos en el disas ahí está el test al, al).
gdb$ until *0x00002b72
0x00002ab1 in -[SmellsGood_AppDelegate check:] ()</pre>
<p>¿Qué pasó?. No llegó nunca a la dirección que esperábamos. ¿Por qué?. Si analizamos el asm (O mas facil el código Objective-C que puse arriba) en un momento pasa esto:</p>
<pre class="prettyprint">0x00002b1d <-[SmellsGood_AppDelegate checkCode:forName:]+35>:	mov    edx,DWORD PTR ds:0x400c
0x00002b23 <-[SmellsGood_AppDelegate checkCode:forName:]+41>:	mov    DWORD PTR [esp+0x4],edx
0x00002b27 <-[SmellsGood_AppDelegate checkCode:forName:]+45>:	mov    DWORD PTR [esp],eax
0x00002b2a <-[SmellsGood_AppDelegate checkCode:forName:]+48>:	call   0x5072
0x00002b2f <-[SmellsGood_AppDelegate checkCode:forName:]+53>:	cmp    eax,0x5
0x00002b32 <-[SmellsGood_AppDelegate checkCode:forName:]+56>:	jne    0x2b80 <-[SmellsGood_AppDelegate checkCode:forName:]+134></pre>
<p>Supongamos por un momento que no tenemos el nombre de los métodos. Veamos que pasa acá:</p>
<p>Tocamos de nuevo &#8220;<em>check</em>&#8221; y vamos hasta este primer call que vemos arriba.</p>
<pre class="prettyprint">Breakpoint 1, 0x00002b01 in -[SmellsGood_AppDelegate checkCode:forName:] ()
gdb$ until *0x00002b2a
0x00002b2a in -[SmellsGood_AppDelegate checkCode:forName:] ()</pre>
<p>Veamos a qué función va a llamar:</p>
<pre class="prettyprint"># Primero el objeto
gdb$ po *(void **)($esp)
{NSCFArray 0x241010} (
dasdasd
)</pre>
<pre class="prettyprint"># Ahora el método
gdb$ x/s *(char **)($esp + 0x4)
0x990bea10:	 "count"</pre>
<p>Ok, básicamente lo que hace esto es fijarse si el tamaño de un array es 5. Si vemos mas arriba lo había separado por &#8220;-&#8221;. Algo ya podemos asumir: el código tiene que tener 5 partes separadas por &#8220;-&#8221;. Probemos ahora el código <strong>X-X-X-X-X</strong> y tocamos &#8220;<em>check</em>&#8220;.</p>
<pre class="prettyprint">Breakpoint 1, 0x00002b01 in -[SmellsGood_AppDelegate checkCode:forName:] ()
gdb$ until *0x00002b72
0x00002b72 in -[SmellsGood_AppDelegate checkCode:forName:] ()</pre>
<p>Ahora si llegamos. Veamos ahí a qué llama:</p>
<pre class="prettyprint">gdb$ po *(void **)($esp)
X-X-X-X-X
gdb$ x/s *(char **)($esp + 0x4)
0x991037e8 <__PRETTY_FUNCTION__.202408+3076>:	 "isEqualToString:"
gdb$ po *(void **)($esp + 0x4)
37E77CCE-999C2986-B5AC28E4-34238294-C7A9F84B</pre>
<p>Well, well well.. Parece que ya tenemos el código para ese nombre!. Pero no vamos a parar acá ¿no?. Sigamos:</p>
<pre class="prettyprint">gdb$ nexti
0x00002b77 in -[SmellsGood_AppDelegate checkCode:forName:] ()
gdb$ nexti
0x00002b7c in -[SmellsGood_AppDelegate checkCode:forName:] ()</pre>
<p>Bueno, ahí estamos en el test al, al. Como ya sabemos al es un partial de eax. Veamos que tiene:</p>
<pre class="prettyprint">gdb$ info reg eax
eax            0x0	0x0</pre>
<p>El test hace un AND sin guardar el resultado en ningún lado, solamente setea los flags// pero para qué digo todo esto si ya saben asm. Ya con esto estamos.</p>
<h3>Cracking</h3>
<p>Siempre hay mas de un camino para seguir a la hora de patchear o generar un keygen, acá es donde juega el ingenio de cada uno. Yo voy a encarar las dos opciones.</p>
<h4>Patching (easy way)</h4>
<p>La opción mas sencilla como ya vimos es cambiar el jne por un je. Para esto vamos a usar un editor hexadecimal.</p>
<p>Recordemos, lo que queremos cambiar es:</p>
<pre class="prettyprint">+132	00002b7e  7502					  jne		  0x00002b82</pre>
<p>Como en este caso, la arquitectura x86 está primero en el mach-O no necesitamos calcular el offset. Directamente vamos a ese offset (0&#215;2b7e) en el editor hexadecimal, tiene que haber un &#8220;75&#8243; (optcode de <strong>jne</strong>). Cambiamos por &#8220;74&#8243; (optcode de <strong>je</strong>), corremos el programa, llenamos el codigo con cualquier cosa de la forma <strong>X-X-X-X-X</strong> y vemos que pasa.</p>
<p>Voilá!.</p>
<h4>Keygen</h4>
<p>Ya que nos tomamos el trabajo de hacer todo el análisis y de comprender qué está pasando, deberíamos aprovechar y hacer un keygen que imite la lógica que ya pudimos deducir.</p>
<p>Este es el mio:</p>
<pre class="prettyprint">from hashlib import sha1

name = raw_input("Nombre?: ").strip()
sha1str = sha1(name).hexdigest().upper()
slots = [sha1str[i:i+8] for i in xrange(0, len(sha1str), 8)]
code = "%s-%s-%s-%s-%s" % (slots[4], slots[3], slots[1], slots[2], slots[0])
print code</pre>
<p>[0] Si se me permite el neologismo</p>
<p style="text-align: right;"><a href="http://twitter.com/Reflejo">@Reflejo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cuerty.com/2010/06/16/181/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un día en internet</title>
		<link>http://blog.cuerty.com/2009/12/08/un-dia-en-internet/</link>
		<comments>http://blog.cuerty.com/2009/12/08/un-dia-en-internet/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 13:39:02 +0000</pubDate>
		<dc:creator>qwerty</dc:creator>
				<category><![CDATA[Sin categoria]]></category>
		<category><![CDATA[infografia]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://blog.cuerty.com/2009/12/08/un-dia-en-internet/</guid>
		<description><![CDATA[Interesante infografía del volumen de datos que se mueven en internet por día:
Created by OnlineEducation.net
]]></description>
			<content:encoded><![CDATA[<p>Interesante infografía del volumen de datos que se mueven en internet por día:</p>
<p><a href="http://www.onlineeducation.net/internet/"><img src="http://www.onlineeducation.net/internet/social-media-count_full.jpg" alt="A Day in the Internet" width="500" height="1624" border="0" /></a><br />Created by <a href="http://www.onlineeducation.net">OnlineEducation.net</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cuerty.com/2009/12/08/un-dia-en-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quotes del dia</title>
		<link>http://blog.cuerty.com/2009/11/19/quotes-del-dia/</link>
		<comments>http://blog.cuerty.com/2009/11/19/quotes-del-dia/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 20:06:09 +0000</pubDate>
		<dc:creator>qwerty</dc:creator>
				<category><![CDATA[Sin categoria]]></category>

		<guid isPermaLink="false">http://blog.cuerty.com/?p=109</guid>
		<description><![CDATA[Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. 
Martin Golding
Programming is like sex: one mistake and you’re providing support for a lifetime.
Michael Sinz
The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.
Seymour [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. </p>
<p>Martin Golding</p></blockquote>
<blockquote><p>Programming is like sex: one mistake and you’re providing support for a lifetime.</p>
<p>Michael Sinz</p></blockquote>
<blockquote><p>The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.</p>
<p>Seymour Cray</p></blockquote>
<blockquote><p>Good code is its own best documentation.</p>
<p>Steve McConnell</p></blockquote>
<blockquote><p>Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves.</p>
<p>Alan Kay</p></blockquote>
<p>Sacadas de <a href="http://wtfcode.net/">WTF Code</a>, una linda distracción mas para suscribirme por RSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cuerty.com/2009/11/19/quotes-del-dia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
