<?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 &#187; Noticias</title>
	<atom:link href="http://blog.48bits.com/category/noticias/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.48bits.com</link>
	<description>48Bits ... The one and a half architecture land.</description>
	<lastBuildDate>Thu, 19 Jan 2012 11:31:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Problemas del análisis de código</title>
		<link>http://blog.48bits.com/2012/01/19/problemas-del-analisis-de-codigo/</link>
		<comments>http://blog.48bits.com/2012/01/19/problemas-del-analisis-de-codigo/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 11:31:59 +0000</pubDate>
		<dc:creator>matalaz</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=2016</guid>
		<description><![CDATA[Aupa, En este post os voy a hablar un poco de como he escrito un motor de análisis de código para x86 y x86_64, de los problemas que me he encontrado y de como he intentado solucionarlos (los que he arreglado, vamos&#8230;). Hace ya algún tiempo que comencé con un proyecto llamado Pyew (similar al [...]]]></description>
			<content:encoded><![CDATA[<p>Aupa,</p>
<p>En este post os voy a hablar un poco de como he escrito un motor de análisis de código para x86 y x86_64, de los problemas que me he encontrado y de como he intentado solucionarlos (los que he arreglado, vamos&#8230;).</p>
<p>Hace ya algún tiempo que comencé con un proyecto llamado <a href="http://pyew.googlecode.com" target="_blank">Pyew</a> (similar al todo poderoso <a href="http://radare.org" target="_blank">radare</a>) el cual está pensado, principalmente, para análisis de baterías de malware. Se podría utilizar el IDA para ello pero, en ocasiones, esta herramienta es un poco pesada y, además, requiere una licencia (no muy barata, por cierto) que no todo el mundo tiene.</p>
<p><span id="more-2016"></span></p>
<p><strong>Comienzo</strong></p>
<p>Al lío. Para hacer un reemplazo ligero del IDA para analizar malware se necesitan como mínimo 3 cosas:</p>
<ol>
<li>Un cargador de formatos de ficheros: Para PE, ELF, Mach-O o lo que sea que te interese. En mi caso he utilizado Python PEFile para PEs y VTrace para ELFs.</li>
<li>Un desensamblador para el procesador: En mi caso, elegí Distorm64 (la versión 2) ya que tiene buen soporte para Python y soporta código x86 de 16, 32 y 64 bits.</li>
<li>Un motor de análisis de código: Esta es la pieza clave que no pude &#8216;coger de por ahí&#8217; fácilmente, sino que me la tendría que escribir desde &#8220;0&#8243; (bueno, la verdad es que se podría utilizar radare, pero preferí escribirlo por mi cuenta y aprender algo de paso).</li>
</ol>
<p><strong>Análisis de código</strong></p>
<div>Análisis de código es el proceso por el cual descubrimos las funciones, los bloques básicos de las que se componen así como las relaciones entre las mismas. Vale, ¿Y qué es un bloque básico? Un conjunto de instrucciones seguidas hasta un salto condicional (no es exactamente así, pero de momento nos quedamos con esta idea). Explicado esto ¿Cómo se realiza análisis de código de un binario para descubrir funciones, bloques básicos, etc&#8230;? Lo primero, hay que saber desde donde empezar a buscar código, desensamblar linealmente desde cada uno de los puntos de entrada hasta encontrar un salto condicional, el cual demarcará cual es el final del bloque básico, y seguir analizando todos los caminos posibles hasta que todas las rutas de código se agoten. Pongamos un ejemplo:</div>
<p>&nbsp;</p>
<div class="dean_ch" style="white-space: wrap;">0x0000a950 <span class="kw1">TEST</span> RDI, RDI<br />
0x0000a953 <span class="kw1">PUSH</span> RBX<br />
0x0000a954 <span class="kw1">MOV</span> RBX, RDI<br />
0x0000a957 <span class="kw1">JZ</span> 0x0000a9c3 <span class="co1">; 1</span><br />
0x0000a957 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
0x0000a959 <span class="kw1">MOV</span> <span class="kw3">ESI</span>, 0x2f<br />
0x0000a95e <span class="kw1">CALL</span> 0&#215;00002410 <span class="co1">; 2</span><br />
<span class="br0">&#40;</span>&#8230;hace sus cositas&#8230;<span class="br0">&#41;</span><br />
0x0000a9c3 <span class="kw1">POP</span> RBX<br />
0x0000a9c4 <span class="kw1">RET</span><br />
0x0000a9c4 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</div>
<p>En este caso, la función que estamos analizando, comienza en la instrucción TEST, en 0xa950 y el bloque básico acaba en el primer salto condicional, en la instrucción JZ (en 0xa957). Ahora tenemos 2 posibles caminos que tomar: en caso de que la condición se cumpla (saltando a 0xa9c3) y el caso contrario, en el cual continuaría con la siguiente instrucción. ¿Cuándo terminaríamos de analizar esta función? Cuando llegamos a la instrucción RET, en 0xa9c4, que es donde acaba el último basic block y ya la función (porque no hay más caminos posibles que seguir).</p>
<div id="attachment_2058" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.48bits.com/wp-content/uploads/2012/01/grafo1.png"><img class="size-medium wp-image-2058" title="Grafo de la función" src="http://blog.48bits.com/wp-content/uploads/2012/01/grafo1-300x264.png" alt="" width="300" height="264" /></a><p class="wp-caption-text">Grafo de la sencilla función comentada</p></div>
<p>Mientras vamos siguiendo el flujo del programa descubriendo nuevas rutas de código, guardamos las llamadas a función, las ponemos en una lista y, al acabar con la función actual, se continúa con las funciones (direcciones) que se hayan encontrado. Hasta aquí todo muy bien y muy fácil. ¿Y con esto se descubren todas las funciones y todos los bloques básicos de una función? Ni mucho menos.</p>
<p><strong>Bloques básicos</strong></p>
<p>Antes había dicho que un bloque básico de una función es un conjunto de instrucciones seguidas hasta un salto condicional, no? Bueno, pues no exactamente. Pongamos un ejemplo fácil:</p>
<div class="dean_ch" style="white-space: wrap;">0x000003c5 <span class="kw1">MOV</span> <span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
0x000003c7 <span class="kw1">SUB</span> <span class="kw3">ESP</span>, 0&#215;28<br />
0x000003ca <span class="kw1">MOV</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span>EBP-0xc<span class="br0">&#93;</span>, 0&#215;0<br />
0x000003d1 <span class="kw1">JMP</span> 0x000003ef <span class="co1">; 1</span><br />
0x000003d1 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
0x000003d3 <span class="kw1">ADD</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span>EBP-0xc<span class="br0">&#93;</span>, 0&#215;1<br />
0x000003d7 <span class="kw1">MOV</span> <span class="kw3">EAX</span>, 0x80484d0<br />
0x000003dc <span class="kw1">MOV</span> <span class="kw3">EDX</span>, <span class="br0">&#91;</span>EBP-0xc<span class="br0">&#93;</span><br />
0x000003df <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span>+0&#215;4<span class="br0">&#93;</span>, <span class="kw3">EDX</span><br />
0x000003e3 <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span><span class="br0">&#93;</span>, <span class="kw3">EAX</span><br />
0x000003e6 <span class="kw1">CALL</span> 0x000002f4 <span class="co1">; 2 j_printf</span><br />
0x000003eb <span class="kw1">ADD</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span>EBP-0xc<span class="br0">&#93;</span>, 0&#215;1<br />
0x000003ef &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
0x000003ef <span class="kw1">CMP</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span>EBP-0xc<span class="br0">&#93;</span>, 0&#215;9<br />
0x000003f3 <span class="kw1">JLE</span> 0x000003d3 <span class="co1">; 3</span><br />
0x000003f3 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
0x000003f5 <span class="kw1">LEAVE</span><br />
0x000003f6 <span class="kw1">RET</span></div>
<p>En este caso, en el primer bloque básico llegamos a un salto incondicional (JMP) y, siguiendo ese salto, encontramos después un salto condicional (JLE) a la dirección 0x3d3.  Las instrucciones desde 0x3c5 hasta 0x3d1 y 0x3ef a 0x3f3 no forman un único bloque básico, por una razón: un bloque básico solo puede tener un único punto de entrada. Así pues, lo que inicialmente creíamos que es un bloque básico hay que separarlo en piezas más pequeñas, de modo que cada bloque tenga solo un único punto de entrada (no así de salida). El grafo de flujo para esta función quedaría como sigue:</p>
<div id="attachment_2059" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.48bits.com/wp-content/uploads/2012/01/grafo2.png"><img class="size-medium wp-image-2059" title="grafo2" src="http://blog.48bits.com/wp-content/uploads/2012/01/grafo2-300x231.png" alt="" width="300" height="231" /></a><p class="wp-caption-text">Grafo de la función con bloques básicos que no cumplen la lóǵica explicada inicialmente.</p></div>
<p>Ahora ya sabemos como tiene que ser un bloque básico correctamente y, teniendo en cuenta esto, ¿Tendríamos ya un motor de análisis de código funcional? Ni mucho menos.</p>
<p><strong>Punteros a función</strong></p>
<p>Los punteros a función son un quebradero de cabeza a la hora de analizar código estáticamente para encontrar funciones. ¿Porqué? Pongamos un ejemplo con el siguiente código en C:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw4">int</span> func<span class="br0">&#40;</span><span class="kw4">int</span> i<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Number of arguments: %d<span class="es0">\n</span>&quot;</span>, i<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></p>
<p><span class="kw4">void</span> foo<span class="br0">&#40;</span><span class="kw4">int</span> <span class="br0">&#40;</span>*f<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>, <span class="kw4">int</span> val<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> f != <span class="kw2">NULL</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f<span class="br0">&#40;</span>val<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; foo<span class="br0">&#40;</span>&amp;amp;func, argc<span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span></div>
<p>Si compilamos este código (con GCC en mi caso) se generará el siguiente código ensamblador:</p>
<div class="dean_ch" style="white-space: wrap;">0x000003c4 <span class="co1">; FUNCTION func</span><br />
0x000003c4 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
0x000003c5 <span class="br0">&#40;</span><span class="nu0">02</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
0x000003c7 <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">SUB</span> <span class="kw3">ESP</span>, 0&#215;18<br />
0x000003ca <span class="br0">&#40;</span><span class="nu0">05</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EAX</span>, 0x80484e0 <span class="co1">; &#8216;Number of arguments: %d\n&#8217;</span><br />
0x000003cf <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EDX</span>, <span class="br0">&#91;</span><span class="kw3">EBP</span>+0&#215;8<span class="br0">&#93;</span><br />
0x000003d2 <span class="br0">&#40;</span><span class="nu0">04</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span>+0&#215;4<span class="br0">&#93;</span>, <span class="kw3">EDX</span><br />
0x000003d6 <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span><span class="br0">&#93;</span>, <span class="kw3">EAX</span><br />
0x000003d9 <span class="br0">&#40;</span><span class="nu0">05</span><span class="br0">&#41;</span> <span class="kw1">CALL</span> 0x000002f4 <span class="co1">; 1 j_printf</span><br />
0x000003de <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">LEAVE</span><br />
0x000003df <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">RET</span><br />
<span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span><br />
0x000003f9 <span class="co1">; FUNCTION main</span><br />
0x000003f9 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
0x000003fa <span class="br0">&#40;</span><span class="nu0">02</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
0x000003fc <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">AND</span> <span class="kw3">ESP</span>, -0&#215;10<br />
0x000003ff <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">SUB</span> <span class="kw3">ESP</span>, 0&#215;10<br />
0&#215;00000402 <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EAX</span>, <span class="br0">&#91;</span><span class="kw3">EBP</span>+0&#215;8<span class="br0">&#93;</span><br />
0&#215;00000405 <span class="br0">&#40;</span><span class="nu0">04</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span>+0&#215;4<span class="br0">&#93;</span>, <span class="kw3">EAX</span><br />
0&#215;00000409 <span class="br0">&#40;</span><span class="nu0">07</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span><span class="kw3">ESP</span><span class="br0">&#93;</span>, 0x80483c4 <span class="co1">; func</span><br />
0&#215;00000410 <span class="br0">&#40;</span><span class="nu0">05</span><span class="br0">&#41;</span> <span class="kw1">CALL</span> 0x000003e0 <span class="co1">; 1 foo</span><br />
0&#215;00000415 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">LEAVE</span><br />
0&#215;00000416 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">RET</span><br />
<span class="br0">&#40;</span>&#8230;<span class="br0">&#41;</span><br />
0x000003e0 <span class="co1">; FUNCTION foo</span><br />
0x000003e0 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
0x000003e1 <span class="br0">&#40;</span><span class="nu0">02</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
0x000003e3 <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">SUB</span> <span class="kw3">ESP</span>, 0&#215;18<br />
0x000003e6 <span class="br0">&#40;</span><span class="nu0">04</span><span class="br0">&#41;</span> <span class="kw1">CMP</span> <span class="kw5">DWORD</span> <span class="br0">&#91;</span><span class="kw3">EBP</span>+0&#215;8<span class="br0">&#93;</span>, 0&#215;0<br />
0x000003ea <span class="br0">&#40;</span><span class="nu0">02</span><span class="br0">&#41;</span> <span class="kw1">JZ</span> 0x000003f7 <span class="co1">; 1</span><br />
0x000003ea &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
0x000003ec <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EAX</span>, <span class="br0">&#91;</span><span class="kw3">EBP</span>+0xc<span class="br0">&#93;</span><br />
0x000003ef <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="br0">&#91;</span><span class="kw3">ESP</span><span class="br0">&#93;</span>, <span class="kw3">EAX</span><br />
0x000003f2 <span class="br0">&#40;</span><span class="nu0">03</span><span class="br0">&#41;</span> <span class="kw1">MOV</span> <span class="kw3">EAX</span>, <span class="br0">&#91;</span><span class="kw3">EBP</span>+0&#215;8<span class="br0">&#93;</span><br />
0x000003f5 <span class="br0">&#40;</span><span class="nu0">02</span><span class="br0">&#41;</span> <span class="kw1">CALL</span> <span class="kw3">EAX</span><br />
0x000003f7 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">LEAVE</span><br />
0x000003f8 <span class="br0">&#40;</span><span class="nu0">01</span><span class="br0">&#41;</span> <span class="kw1">RET</span></div>
<p>Realmente, no tenemos ninguna ruta de código a esa función así que, siguiendo la lógica actual de nuestro motor, no encontraremos la función &#8220;func&#8221;. ¿Soluciones? Varias, una de ellas, la más compleja, es trackear los argumentos y sus valores (haciendo una especie de mini-emulación). Si una dirección es pasada como argumento a una función y después se ejecuta esa dirección, pues sabemos que es un puntero a función, así que esa dirección la metemos en la cola de direcciones a analizar y listo.</p>
<p>Sin embargo, esta solución tampoco es 100% correcta. ¿Porqué? Imaginemos que la función que se encarga de ejecutar el puntero que le pasamos está en una librería, no en el binario que estamos ejecutando: como no tenemos el código de la librería (no se encuentra en el binario que estamos analizando) no sabemos que hará con esa dirección que se le pasa. Mi solución para esto es la siguiente: cada  vez que se referencia una dirección a un segmento ejecutable, esta dirección la pongo en la cola para posterior análisis. De este modo, muchas funciones de este tipo se podrían descubrir.</p>
<p>Aún así, tenemos otro problema más: ¿Y si el puntero se calcula en ejecución? Pues estamos jodidos, básicamente. Podemos intentar otras soluciones, como la siguiente.</p>
<p><strong>Prólogos de función</strong></p>
<p>El modo más típico de búsqueda de funciones es la búsqueda de prólogos de función. Por ejemplo, para x86 (32 bits) el siguiente es un prólogo típico:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
<span class="kw1">MOV</span> &nbsp;<span class="kw3">EBP</span>, <span class="kw3">ESP</span></div>
<p>Podríamos, simplemente, buscar los opcodes de este prólogo de función en los segmentos con permisos de ejecución (no necesariamente, ya que para malware, puede ser que se encuentre código en segmentos que no tienen permisos de ejecución y que luego se copien a una zona de memoria donde sí se tengan privilegios)  y, si esa dirección no corresponde con ninguna función ya analizada, poner dichas direcciones en la cola de análisis. Así se pueden encontrar muchas funciones que de otro modo, probablemente, no encontraríamos.</p>
<p>Pero, como siempre con el análisis de código, esta técnica tiene la oxtia de problemas: ¿Y si los opcodes que he encontrado corresponden a ese prólogo pero realmente no es una función? Este problema no es tan fácil de solucionar, la verdad. Mi solución es seguir desensamblando, buscando si el código tiene sentido (encuentro rutas de código que no se van a casa krixto, encuentro bloques básicos bien formados, etc&#8230;). Aún así, esta solución es solo parcial: ¿Qué ocurre si, por casualidad, resulta que encuentro una zona que parece código correcto y no lo es? La posible solución (que en Pyew no la he puesto aún) es asegurarse que el epílogo de función coincida. Esto es, si el prólogo de función típico de x86 es PUSH EBP &amp; MOV EBP, ESP; habrá que buscar su epílogo correspondiente en los bloques básicos de salida, que es LEAVE &amp; RET. Aún así, esto tampoco sería correcto, un ejemplo:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
<span class="kw1">MOV</span> &nbsp;<span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
<span class="kw1">MOV</span> &nbsp;<span class="kw3">EAX</span>, EBP<span class="nu0">+4</span><br />
<span class="kw1">JMP</span> &nbsp;<span class="br0">&#91;</span>EAX<span class="nu0">+8</span><span class="br0">&#93;</span></div>
<p>Esto podría ser un código perfectamente válido. La función recibe un argumento y salta inconicionalmente (que no llama) a la dirección pasada más un offset (una VTable, por ejemplo). La función a la que salta es la que, realmente, se encarga de arreglar la pila antes de retornar, es decir, es en esa zona de memoria donde se encuentra el epílogo de función.</p>
<p>De todos modos, vamos a suponer que &#8216;mágicamente&#8217; tenemos solucionado también este problema. ¿Se podría decir que el motor está finalizado? Ni mucho menos: la búsqueda de prólogos de función es un coñazo porque hay múltiples prólogos de función. Por ejemplo, si desensamblamos ejecutables de Microsoft (librerías de Windows, el notepad, lo que sea) nos encontraremos que los prólogos a función no son como había puesto antes, sino así:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">MOV</span> &nbsp;<span class="kw3">EDI</span>, <span class="kw3">EDI</span><br />
<span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
<span class="kw1">MOV</span> &nbsp;<span class="kw3">EBP</span>, <span class="kw3">ESP</span></div>
<p>Así que nuestro motor de análisis de código no estaría encontrando el principio de la función, si no que estaríamos saltándonos una instrucción. La solución es buscar más prólogos: en vez de buscar solo PUSH EBP &amp; MOV EBP, ESP, buscamos también con MOV EDI, EDI antes. Pero aún así, no vamos a encontrar todas las funciones del binario. ¿Porqué? Por la convención de llamadas de cada función, entre otras n-mil cosas.</p>
<p><strong>Convenciones de llamada</strong></p>
<p>Cada compilador, arquitectura, etc&#8230; tiene una serie de <a href="http://en.wikipedia.org/wiki/Calling_convention" target="_blank">convenciones de llamadas</a>, siendo las más típicas (x86) <a href="http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl" target="_blank">CDECL</a> y <a href="http://en.wikipedia.org/wiki/X86_calling_conventions#stdcall" target="_blank">STDCALL</a>. La diferencia principal entre estas 2 convenciones de llamadas es la siguiente: en CDECL es el que llama a la función el que se encarga de restaurar la pila, mientras que en STDCALL es la función llamada la que tiene que restaurar la pila. En ambos casos, el prólogo de función cambiará, así que estamos jodidos.</p>
<p>Por si esto fuera poco, estas 2 no son las únicas convenciones de llamadas existentes. Tenemos otras más, como por ejemplo <a href="http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall" target="_blank">FASTCALL</a> (la cual, por cierto, es implementada por cada fabricante como se le pone de los huevos), <a href="http://en.wikipedia.org/wiki/X86_calling_conventions#pascal" target="_blank">PASCAL</a>, <a href="http://en.wikipedia.org/wiki/X86_calling_conventions#thiscall" target="_blank">THISCALL</a> o incluso podemos tener convenciones de llamada no estándar que el compilador ha decidido meter &#8220;así&#8221; porque resultaban más eficientes o usaban menos espacio.</p>
<p>Pero este no es el final de los problemas, aún tenemos otros todavía más gordos&#8230;</p>
<p><strong>El coño de la Bernarda (también llamado contrucciones &#8220;switch&#8221;)</strong></p>
<p>Un switch es una sentencia condicional que en función del valor comprobado tomará una ruta u otra o, incluso, varias. ¿Cómo se imlementa un switch en ensamblador? Cada compilador lo hace como se le pone de ahí. El modo más típico es el siguiente: tener una tabla de offsets a función y llamar a un registro (donde está la dirección de esa tabla) &#8220;+&#8221; un offset, que sería el índice dentro de la tabla. Este es el modo más típico para un switch medio/grande. Veamos un ejemplo con el siguiente grafo visto en IDA:</p>
<div id="attachment_2066" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.48bits.com/wp-content/uploads/2012/01/switch.png"><img class="size-medium wp-image-2066" title="switch" src="http://blog.48bits.com/wp-content/uploads/2012/01/switch-300x119.png" alt="" width="300" height="119" /></a><p class="wp-caption-text">Ejemplo de switch sencillo (GCC, 32bits)</p></div>
<p>Si miramos el bloque básico que tiene varias salidas nos encontraremos con el siguiente código ensamblador:</p>
<p>&nbsp;</p>
<div class="dean_ch" style="white-space: wrap;">.text:<span class="nu0">08048414</span><br />
.text:<span class="nu0">08048414</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">public</span> main<br />
.text:<span class="nu0">08048414</span> main &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">proc</span> <span class="kw5">near</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; DATA XREF: _start+17o</span><br />
.text:<span class="nu0">08048414</span><br />
.text:<span class="nu0">08048414</span> arg_0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="kw5">dword</span> <span class="kw4">ptr</span> &nbsp;<span class="nu0">8</span><br />
.text:<span class="nu0">08048414</span> arg_4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = <span class="kw5">dword</span> <span class="kw4">ptr</span> &nbsp;<span class="re0">0Ch</span><br />
.text:<span class="nu0">08048414</span><br />
.text:<span class="nu0">08048414</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">push</span> &nbsp; &nbsp;<span class="kw3">ebp</span><br />
.text:<span class="nu0">08048415</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">mov</span> &nbsp; &nbsp; <span class="kw3">ebp</span>, <span class="kw3">esp</span><br />
.text:<span class="nu0">08048417</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">and</span> &nbsp; &nbsp; <span class="kw3">esp</span>, <span class="re0">0FFFFFFF0h</span><br />
.text:0804841A &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">push</span> &nbsp; &nbsp;<span class="kw3">ebx</span><br />
.text:<span class="nu0">080484</span><span class="re1">1B</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">sub</span> &nbsp; &nbsp; <span class="kw3">esp</span>, 1Ch<br />
.text:0804841E &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">cmp</span> &nbsp; &nbsp; <span class="br0">&#91;</span><span class="kw3">ebp</span>+arg_0<span class="br0">&#93;</span>, <span class="nu0">7</span> &nbsp;<span class="co1">; switch 8 cases</span><br />
.text:<span class="nu0">08048422</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">ja</span> &nbsp; &nbsp; &nbsp;loc_80484D7<br />
.text:<span class="nu0">08048428</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">mov</span> &nbsp; &nbsp; <span class="kw3">eax</span>, <span class="br0">&#91;</span><span class="kw3">ebp</span>+arg_0<span class="br0">&#93;</span><br />
.text:0804842B &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">shl</span> &nbsp; &nbsp; <span class="kw3">eax</span>, <span class="nu0">2</span><br />
.text:0804842E &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">mov</span> &nbsp; &nbsp; <span class="kw3">eax</span>, <span class="kw3">ds</span> : off_8048670<span class="br0">&#91;</span><span class="kw3">eax</span><span class="br0">&#93;</span><br />
.text:<span class="nu0">08048434</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">jmp</span> &nbsp; &nbsp; <span class="kw3">eax</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">; switch jump</span><br />
.text:<span class="nu0">08048436</span> <span class="co1">; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span><br />
.text:<span class="nu0">08048436</span></div>
<p>IDA ha encontrado que la dirección 0&#215;8048670 es una tabla de offsets (direcciones) a los bloques básicos que ha unido después. Es decir, ha encontrado un switch. ¿Cómo lo ha hecho IDA? Analizando el código que se encuentra en ese offset que ha encontrado que luego se accede al mismo por índice (0x0804842E) y que después hay un salto incondicional al valor que haya obtenido. Así que, si nosotros hacemos lo mismo en nuestro motor ¿Ya tendríamos soporte para sentencias switch? Ni de lejos&#8230; Cada compilador y cada arquitectura tiene varios tipos diferentes de dialecto de switch. Unos crean tablas como la que aquí se muestra. Otros, lo hacen accediendo a zonas de memoria relativa obteniendo la posición en ejecución. Un ejemplo (escrito a mano, que ahora mismo no encuentro ningún binario):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw1">PUSH</span> <span class="kw3">EBP</span><br />
<span class="kw1">MOV</span> &nbsp;<span class="kw3">EBP</span>, <span class="kw3">ESP</span><br />
<span class="kw1">CALL</span> <span class="nu0">+5</span><br />
<span class="kw1">POP</span> &nbsp;<span class="kw3">EAX</span><br />
<span class="kw1">ADD</span> &nbsp;<span class="kw3">EAX</span>, <span class="br0">&#91;</span>0xSOMEVALUE, <span class="kw3">EDX</span>, <span class="nu0">1</span><span class="br0">&#93;</span><br />
<span class="kw1">JMP</span> &nbsp;<span class="kw3">EAX</span></div>
<p>En este ejemplo, el compilador ha decidido que era mejor (por algún motivo) coger la dirección relativa de la tabla de funciones obteniendo la dirección de la función actual (de ahí el CALL +5 &amp; POP EAX, para saber la dirección de la instrucción que se está ejecutando en ese momento).</p>
<p>Otra cosa que estoy obviando: estoy suponiendo que la tabla donde se apunta a las direcciones de los bloques básicos son contiguas y que son completas, osea, que estará del modo siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">.rodata:<span class="nu0">08048670</span> off_8048670 &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_8048436 &nbsp; <span class="co1">; DATA XREF: main+1Ar</span><br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_8048447 &nbsp; <span class="co1">; jump table for switch statement</span><br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_8048458<br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_804846B<br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_804846B<br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_80484AD<br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_80484BB<br />
.rodata:<span class="nu0">08048670</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">dd</span> <span class="kw4">offset</span> loc_80484C9</div>
<p>Sin embargo, esto no tiene porque ser así. En muchos casos me he encontrado que lo que realmente hay son direcciones relativas. Es decir, en vez de la dirección virtual completa nos encontramos simplemente el último WORD de la dirección. Por ejemplo, en vez de encontrarte una dirección como 0&#215;08048436, te encontrarías con la dirección 0&#215;8436, a la cual luego se le sumaría la base 0&#215;08040000. O, aún peor, que lo que hay son las diferencias entre direcciones, es decir, el resultado de restar la dirección anterior de la actual. Y así podría seguir hasta aburriros y no acabaría en la puta vida.</p>
<p>Bueno, creo que el post ya es bastante largo así que lo dejo aquí. Espero que os haya gustado!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2012/01/19/problemas-del-analisis-de-codigo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>¿Qué sabemos de TVE? No sabemos mucho.</title>
		<link>http://blog.48bits.com/2011/11/07/%c2%bfque-sabemos-de-tve-no-sabemos-mucho/</link>
		<comments>http://blog.48bits.com/2011/11/07/%c2%bfque-sabemos-de-tve-no-sabemos-mucho/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 19:46:01 +0000</pubDate>
		<dc:creator>Ruben Santamarta</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1993</guid>
		<description><![CDATA[Hola pepsicola. Hoy, a menos que La Noria lleve a Ortega Cano para que explique cómo matar a alguien y estar en la calle, la pandereta estará sobrevolando &#8220;el debate&#8221; en breves minutos. Hace unos meses surgió una nueva polémica política respecto al control de RTVE, si bien ésta era un poco más curiosa. En [...]]]></description>
			<content:encoded><![CDATA[<p>Hola pepsicola.</p>
<p>Hoy, a menos que La Noria  lleve a Ortega Cano para que explique cómo matar a alguien y estar en la calle, la pandereta estará sobrevolando &#8220;el debate&#8221; en breves minutos.</p>
<p>Hace unos meses surgió una nueva polémica política respecto al control de RTVE, si bien ésta era un poco más curiosa. En todas las noticias al respecto veíamos que se mencionaba explícitamente un sistema de generación de noticias para medios de comunicación, que es el estandar de facto de la industria, el <a href="http://www.avid.com/es/products/iNEWS">iNews</a>.</p>
<p>Me voy a morder la lengua por no hacer lo propio con la yugular de alguno, así que vamos a lo que vamos.<br />
<span id="more-1993"></span></p>
<p>Primero establezcamos el contexto con estos artículos</p>
<p><a href="http://www.rtve.es/television/20110923/comunicacion-sobre-decision-del-consejo-administracion-crtve-programa-inews/463593.shtml">http://www.rtve.es/television/20110923/comunicacion-sobre-decision-del-consejo-administracion-crtve-programa-inews/463593.shtml</a><br />
<a href="http://www.vayatele.com/profesionales/que-es-inews-y-que-tiene-que-ver-con-el-consejo-de-rtve" target="_blank">http://www.vayatele.com/profesionales/que-es-inews-y-que-tiene-que-ver-con-el-consejo-de-rtve</a></p>
<p>Parece que todo el mundo confía en la integridad del acceso al iNews. Asi que me puse a investigar un poco cómo funcionan las &#8220;teles&#8221; por dentro, en este caso TVE.</p>
<p>Lo primero que hice fue llamar a RTVE e intentar sobornar con donetes a algunos empleados para que me pasaran información. La cosa, incomprensiblemente, no funcionó así que hubo que pasar al plan B: Open Source Intelligence. Es decir, lo de siempre: Webs,comunicados, notas de prensa, pliegos, videos, foros, ir a tomar cafe al mismo bar que suelen ir los trabajadores a poner la oreja o a dejar un pendrive con el logo de TVE olvidado en la barra, etc etc&#8230;</p>
<p>He hecho una selección de las fuentes que proporcionan más información:</p>
<p>En esta web <a href="http://www.cobdc.net/12JCD/actes/">http://www.cobdc.net/12JCD/actes/</a> nos encontramos con 3 documentos interesantes, las presentaciones y papers de &#8220;El Gestor de archivo, nuevo perfil profesional en la redacción única de TVE&#8221; y &#8220;El uso de imágenes procedentes de Internet en los informativos de TVE&#8221;</p>
<p>Encontramos informaciones técnicas y operativas interesantes, que nos permiten ir formándonos una imagen del escenario. </p>
<p><a href="http://www.cobdc.org/jornades/12JCD/materials/comunicacions/pres/MEANA_gestor_archivo_nuevo_perfil_tve.pdf" target="_blank">http://www.cobdc.org/jornades/12JCD/materials/comunicacions/pres/MEANA_gestor_archivo_nuevo_perfil_tve.pdf</a></p>
<p><a href="http://www.cobdc.org/jornades/12JCD/materials/comunicacions/MEANA_gestor_archivo_nuevo_perfil_tve.pdf" target="_blank">http://www.cobdc.org/jornades/12JCD/materials/comunicacions/MEANA_gestor_archivo_nuevo_perfil_tve.pdf</a></p>
<p><a href="http://www.cobdc.org/jornades/12JCD/materials/comunicacions/AGUILAR_uso_imagenes_internet_tve.pdf" target="_blank">http://www.cobdc.org/jornades/12JCD/materials/comunicacions/AGUILAR_uso_imagenes_internet_tve.pdf</a></p>
<p>Los dos últimos ficheros son fundamentales para entender el artículo, así que recomiendo su lectura. Explican la manera de funcionar de las redacciones de TVE, desde el punto de vista técnico y funcional.</p>
<p><strong>Ejemplos de la información extraida</strong></p>
<p><u>MEANA_gestor_archivo_nuevo_perfil_tve.pdf</u><br />
&#8220;<em>En los SSII de TVE todos los periodistas tienen la posibilidad de trabajar con texto, audio y vídeo en alta resolución. Todos trabajan sobre estas plataformas y elaboran su noticia desde su puesto de trabajo, es decir, escriben texto y después sobre el mismo equipo abren su software de edición que apunta a servidores de vídeo o unidades de almacenamiento compartido donde pueden encontrar las imágenes que necesitan.</em>&#8221;</p>
<p><em>&#8220;Sin embargo, en la actual redacción digital de TVE, todo el material que<br />
llega en cualquier formato, se digitaliza, y se introduce en el<br />
almacenamiento compartido junto con los metadatos que lo identifican. Este<br />
proceso de digitalización se llama “ingesta”.&#8221;</em></p>
<p>&#8220;<em>El sistema se compone de un gran almacenamiento compartido llamado<br />
ISIS/Interplay (Avid) que contiene todos los materiales con los que se puede<br />
trabajar en un día. Este gran almacén tiene una capacidad cercana  a 4.000<br />
horas de vídeo y audio. Desde cualquier puesto de trabajo se puede tener<br />
acceso a este almacén, añadiendo nuevos  materiales, ingestando o<br />
descargando contenidos que servirán para elaborar nuevos productos<br />
informativos</em>&#8221;</p>
<p>&#8220;<em>La Ingesta Central es donde se llevan a cabo las grabaciones de líneas. En<br />
la redacción digital de TVE existe un departamento  que graba las señales<br />
externas en  ISIS. Utiliza 24 equipos llamados  Airspeed (Avid), que se<br />
pueden programar si se trata de envíos periódicos</em>&#8221;</p>
<p>&#8220;<em>Una vez que el material ha pasado desde los Airspeed a ISIS, el redactor o<br />
el realizador dispone del mismo y pueden editar su  noticia o pieza con<br />
cualquier sistema de edición no lineal.<br />
Para el montaje de una noticia, el redactor trabaja con dos aplicaciones<br />
principales:<br />
<strong>Instinct</strong> e <strong>Inews</strong> (ambos de Avid) que trabajan en paralelo</em>&#8221;</p>
<p><u>AGUILAR_uso_imagenes_internet_tve.pdf</u><br />
<em>En el caso de los Informativos de TVE, las tareas estrictamente de ingesta<br />
están a cargo de dos secciones distintas:<br />
- Ingesta Central, encargada de  la recepción de señales. Cuenta<br />
para ello con 25  AirSpeed  (servidor de ingesta directa de la<br />
empresa Avid).<br />
- Ingesta Local, responsable del resto de formatos que se capturan:<br />
ENG, cintas del Archivo histórico, DVD, CD, Web y memorias tipo<br />
flash.  Cuenta con 6  NewsCutter Adrenalin</em></p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/11/rtve_1.png" alt="" title="rtve_1" width="600" height="300" class="aligncenter size-full wp-image-1994" /><br />
<em>Esquema 1</em><br />
Atendiendo a este esquema  donde aparece Odetics para el archivo antiguo, deberían tener algo parecido a esto, mola.<br />
<a href='http://www.youtube.com/watch?v=9fTJkVgRvpw' target=blank >http://www.youtube.com/watch?v=9fTJkVgRvpw</a></p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/11/rtve_2.png" alt="" title="rtve_1" width="600" height="300" class="aligncenter size-full wp-image-1994" /><br />
<i>Esquema 2</i></p>
<p>Las imágenes y el texto recopiladas nos llevan a realizar otras búsquedas y averiguar que software, hardware y qué empresas están detrás.</p>
<p>Esta web de la revista de temática audiovisual nos ofrece un artículo con bastante información<br />
<a href="http://www.tmbroadcast.es/index.php/tve-hasta-el-infinito-y-mas-alla/" target="_blank">http://www.tmbroadcast.es/index.php/tve-hasta-el-infinito-y-mas-alla/</a><br />
Separándola convenientemente entre Producción, Emisión y Archivo. </p>
<p><em>Producción</em><br />
&#8220;<em>En la redacción se han instalado un total de 300 clientes concurrentes. La herramienta básica de trabajo para el redactor es Avid iNews Instinct</em>&#8221;</p>
<p>Bien, esto cuadra con todo el revuelo organizado en base al control de iNews. Veamos un poco más del iNews en este <a href="http://www.rtve.es/alacarta/videos/la-2-noticias/2-noticias-14-10-11/1223949/#aHR0cDovL3d3dy5ydHZlLmVzL2FsYWNhcnRhL2ludGVybm8vY29udGVudHRhYmxlLnNodG1sP3BicT0yJm1vZGw9VE9DJmxvY2FsZT1lcyZwYWdlU2l6ZT0xNSZjdHg9MTYzNSZhZHZTZWFyY2hPcGVuPWZhbHNl" target="_blank">video (3:05)</a> de La 2 Noticias; Mara Torres invita a David Trueba a dirigir el informativo y donde hablan brevemente sobre este software.</p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/11/rtve_com2.png" alt="" title="rtve_com2" width="595" height="334" class="aligncenter size-full wp-image-1997" /><br />
El Famoso iNews<br />
<img src="http://blog.48bits.com/wp-content/uploads/2011/11/rtve_com4.png" alt="" title="rtve_com4" width="596" height="336" class="aligncenter size-full wp-image-1998" /><br />
Podemos deducir un poco más de como tienen estructurada la arquitectura, se ve que usan switchs KVM</p>
<p><em>Emisión</em><br />
&#8220;Como sistema de emisión se ha instalado el sistema ADC-100 de Harris con cliente, Production Client&#8221;<br />
<img src="http://blog.48bits.com/wp-content/uploads/2011/11/rtve_com5.png" alt="" title="rtve_com5" width="595" height="334" class="aligncenter size-full wp-image-1996" /><br />
Fijaos en la pantalla resaltada, bastante parecida a ésta, perteneciente al BroadcastSupervisor del ADC-100, lo que también cuadra.<br />
<a href="http://www.broadcast.harris.com/productsandsolutions/Automation/ADCBroadcastSupervisor.asp" target="_blank"><img alt="" src="http://www.broadcast.harris.com/media/Broadcast-Supervisor_25-9877.jpg" class="alignnone" width="550" height="439" /></a><br />
La arquitectura vendría a ser así<br />
<img src="http://www.broadcast.harris.com/media/ADCPlayoutAutomationWorkflow_25-7914.jpg" /><br />
Podemos observar varios de los elementos que vemos en la foto de La 2.</p>
<p>A más alto nivel<br />
<img src="http://www.mediamughals.com/images/broadcast/Adc_playout_M123jpg.jpg" /></p>
<p>Recapitulando, tenemos que están usando básicamente:</p>
<p>Avid NewsCutter XP<br />
Avid NewsCutter Adrenaline<br />
Avid iNews/Instinct<br />
Avid Media Composer<br />
Avid Interplay<br />
Servers Avid MediaStream<br />
Server Avid Unity ISIS<br />
25 servers AirSpeed<br />
Sistema Harris ADC-100 con el hardware/software asociado</p>
<p>Echemos un ojo al uso de puertos, y por lo tanto funcionalidades, por parte del Software/hardware de Avid <a href="http://cdn.pinnaclesys.com/SupportFiles/FAQ_Avid/243397/Port_Usage_Guide_UPDATED_24SEP2009.xls">http://cdn.pinnaclesys.com/SupportFiles/FAQ_Avid/243397/Port_Usage_Guide_UPDATED_24SEP2009.xls</a></p>
<p>Es un CTF en toda regla. Cuanto más lejos llegues, más pollas ascii podrás poner en el mapa del tiempo durante el telediario.</p>
<p><strong>¿Cómo de seguro es el iNews?</strong></p>
<p>Con tanto revuelo, que si se puede acceder o no al iNews y ver qué está escribiendo cada periodista, quise echar un ojo a la autentificación al menos. </p>
<p>En principio debido a las características del Software de Avid y los tipos de clientes, es bastante restringido. Aunque haciendo un poco el retard-ninja  he conseguido algunos, entre ellos el famoso iNews.  </p>
<p>Como hemos visto iNews es un software cliente, y desgraciadamente no tenemos acceso al servidor. Sin embargo, sólo para escarbar la superficie de lo que puede ser, quise comprobar si al menos cifraba las credenciales antes de enviarlas al servidor. Efectivamente no.</p>
<p>Si no tenemos un servidor pues no los inventamos, mejor dicho lo moldeamos. La técnica es útil en estos casos: crear un server dummy, dejar que el cliente iNews -ANWS.exe- hable con nosotros y ver qué peticiones espera. Vamos analizando el parser de paquetes y construimos el servidor según esto, finalmente podemos completar la secuencia y llegar a la autentificación</p>
<p>Básicamente el cliente se comunica con el server, le envía un &#8216;ping&#8217; y este le dice que acción realizar, sí está disponible o no, seguidamente se comprueban que las versiones de ambos son compatibles y se realiza la petición de autentificación.</p>
<p>Mediante ingeniería inversa vamos analizando las peticiones que espera recibir el cliente y cómo parsea los datos, moldeandonos el server según lo que vemos, que quedaría así.</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="kw1">import</span> <span class="kw3">socket</span><br />
<span class="kw1">import</span> <span class="kw3">binascii</span></p>
<p>server_socket = <span class="kw3">socket</span>.<span class="kw3">socket</span><span class="br0">&#40;</span><span class="kw3">socket</span>.<span class="me1">AF_INET</span>, <span class="kw3">socket</span>.<span class="me1">SOCK_STREAM</span><span class="br0">&#41;</span><br />
server_socket.<span class="me1">bind</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>, <span class="nu0">1019</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
server_socket.<span class="me1">listen</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span></p>
<p><span class="kw1">print</span> <span class="st0">&quot;Fake iNews Server &#8211; Testing plain authentication&quot;</span><br />
client_socket, address = server_socket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Britney spears is connected&quot;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Receiving PING&quot;</span> </p>
<p>data = client_socket.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="kw2">repr</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;OK- Sending LOGIN Request&quot;</span><br />
client_socket.<span class="me1">send</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\x</span>04<span class="es0">\x</span>00<span class="es0">\x</span>00<span class="es0">\x</span>00&quot;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Receiving CLIENT version&quot;</span><br />
data = client_socket.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">28</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="kw2">repr</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Sending SERVER Version&quot;</span><br />
client_socket.<span class="me1">send</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\x</span>04&quot;</span><span class="br0">&#41;</span><br />
data = client_socket.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Initiating AUTH request&quot;</span><br />
<span class="kw1">print</span> <span class="kw2">repr</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;Completing AUTH request&quot;</span><br />
client_socket.<span class="me1">send</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\x</span>80&quot;</span><span class="br0">&#41;</span> <br />
client_socket.<span class="me1">send</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\x</span>81&quot;</span>*0&#215;20<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&quot;receiving plaintext user/password, leaking memory&#8230;&quot;</span><br />
data = client_socket.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="kw2">repr</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
data = client_socket.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">800</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="kw2">repr</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp;</div>
<blockquote><p>Fake iNews Server &#8211; Testing plain authentication<br />
Britney spears is connected<br />
Receiving PING<br />
&#8216;\x17\n&#8217;<br />
OK- Sending LOGIN Request<br />
Receiving CLIENT version<br />
&#8216;#(@) 3.2.5.9  DOS\x00&#8242;<br />
Sending SERVER Version<br />
Initiating AUTH request<br />
&#8216;\xfc\x03\x00\x00\xfc\x03\x00\x00&#8242;<br />
Completing AUTH request<br />
receiving plaintext user/password&#8230;<br />
&#8216;\x05\x81\x81\x00\xfe\x01\x02\x00&#8242;<br />
&#8216;\x00\x04\x81\x81\x00\x01\x02\t\x00\xbd\x04\x81\x00\x04\x14\x02a\x00a\x00a\x00a\x00a\x00a\x00a\x00a\x00a\x00a\x00&#8230;.</p></blockquote>
<p>Curiosamente  tras 3 intentos fallidos de autentificación, el programa muestra un Message Box diciéndote que has agotado los intentos, que te pires y se cierra. Pero teniendo en cuenta que nosotros somos el server y no le hemos dicho nada, la cuenta de los logins fallidos está en el lado cliente. </p>
<p>Lo que no puedo asegurar es si sólo está en ese lado, ya que no tengo un server. Si sólo se mantiene en el client-side además podríamos construir un programa para bruteforcear logins facilmente. La forma de interceptar las credenciales ya dependería de la arquitectura de red.</p>
<p>Los periodistas pueden estar &#8220;tranquilos&#8221;, a nivel de la aplicación sus credenciales están viajando en texto claro. Vamos que si no oficialmente, &#8216;extraoficialmente&#8217; en principio no parece muy complicado monitorizarlo.</p>
<p>Bueno, pues ya sabemos algo más de cómo funciona TVE por dentro. Ahora a &#8216;disfrutar&#8217; del debate, a ver si pasa algo raro&#8230;</p>
<p>Si alguno tiene más información o correcciones, escribid un comentario!</p>
<p>Hasta la próxima gorrillas del ciberespacio.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2011/11/07/%c2%bfque-sabemos-de-tve-no-sabemos-mucho/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Windbg Scripting</title>
		<link>http://blog.48bits.com/2011/06/21/windbg-scripting/</link>
		<comments>http://blog.48bits.com/2011/06/21/windbg-scripting/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 15:34:20 +0000</pubDate>
		<dc:creator>inocraM</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1914</guid>
		<description><![CDATA[Aunque el lenguaje de scripting del Windbg no es precisamente una maravilla, si se usa el Windbg con la suficiente frecuencia siempre acaba siendo conveniente tener tus scripts para llevar a cabo algunas tareas repetitivas. Un ejemplo tipico es el caso en el que cargas un ejecutable dentro del Windbg y quieres comenzar poniendo BreakPoins [...]]]></description>
			<content:encoded><![CDATA[<p> Aunque el lenguaje de scripting del Windbg no es precisamente una maravilla, si se usa el Windbg con la suficiente frecuencia siempre acaba siendo conveniente tener tus scripts para llevar a cabo algunas tareas repetitivas.</p>
<p>Un ejemplo tipico es el caso en el que cargas un ejecutable dentro del Windbg y quieres comenzar poniendo BreakPoins hardware. Como el punto en el que el Loader de Windows ejecuta el DebugBreak es anterior al punto en el que se inicializa el contexto del hilo principal del programa, tus BreakPoints hadware desapareceran.<br />
<span id="more-1914"></span><br />
Una forma de solucionar ese problema es, por ejemplo, poner un BreakPoint en el EntryPoint de la aplicacion que queremos depurar y poner los BreakPoints hardware una vez que hayamos alcanzado dicho punto. Tener un Script que te ponga un punto de ruptura en el EntryPoint de la aplicacion simplifica muchisimo esta tarea:</p>
<div class="dean_ch" style="white-space: wrap;">
.<span class="me1">block</span><br />
<span class="br0">&#123;</span><br />
&nbsp; r? $t0 = &amp;@$peb-&gt;Ldr-&gt;InLoadOrderModuleList<br />
&nbsp; r? $t0 = *<span class="br0">&#40;</span>ntdll!_LDR_DATA_TABLE_ENTRY**<span class="br0">&#41;</span>@$t0;</p>
<p>&nbsp; as /x $<span class="br0">&#123;</span>/v:$Base<span class="br0">&#125;</span> @@c++<span class="br0">&#40;</span>@$t0-&gt;DllBase<span class="br0">&#41;</span><br />
&nbsp; as /msu $<span class="br0">&#123;</span>/v:$Mod<span class="br0">&#125;</span> @@c++<span class="br0">&#40;</span>&amp;@$t0-&gt;FullDllName<span class="br0">&#41;</span></p>
<p>&nbsp; .<span class="me1">block</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; .<span class="me1">echo</span> $<span class="br0">&#123;</span>$Mod<span class="br0">&#125;</span> at $<span class="br0">&#123;</span>$Base<span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; r $t0 = $<span class="br0">&#123;</span>$Base<span class="br0">&#125;</span> + poi<span class="br0">&#40;</span>$<span class="br0">&#123;</span>$Base<span class="br0">&#125;</span> + 3c<span class="br0">&#41;</span><br />
&nbsp; &nbsp; .<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="st0">&quot;PeHeader at: %p <span class="es0">\n</span>&quot;</span>, @$t0</p>
<p>
&nbsp; &nbsp; r $t1 = $<span class="br0">&#123;</span>$Base<span class="br0">&#125;</span> + poi<span class="br0">&#40;</span>@$t0 + <span class="nu0">28</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; .<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="st0">&quot;Entry point found at %p <span class="es0">\n</span>&quot;</span>, @$t1</p>
<p>&nbsp; &nbsp; bp @$t1<br />
&nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; ad $<span class="br0">&#123;</span>/v:$Base<span class="br0">&#125;</span><br />
&nbsp; ad $<span class="br0">&#123;</span>/v:$Mod<span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div>
<p>Un ejemplo de uso de este script depurando la calculadora de windows:</p>
<div class="dean_ch" style="white-space: wrap;">
<span class="nu0">0</span>:<span class="nu0">000</span>&gt; .<span class="me1">symfix</span> c:\symbols<br />
<span class="nu0">0</span>:<span class="nu0">000</span>&gt; .<span class="me1">reload</span><br />
Reloading current modules<br />
&#8230;&#8230;&#8230;..<br />
<span class="nu0">0</span>:<span class="nu0">000</span>&gt; $$&gt;a&lt;c:\ep.<span class="me1">wds</span><br />
C:\WINDOWS\system32\calc.<span class="me1">exe</span> at 0&#215;1000000<br />
PeHeader at: 010000f0 <br />
Entry point found at <span class="nu0">01012475</span> <br />
&nbsp;</div>
<p>A mi personalmente me gusta mas el sistema de extensiones del Windbg, pero tengo que reconocer que para algunas cosas en las que no te quieres complicar mucho la vida, los scripts de Windbg pueden estar bien <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2011/06/21/windbg-scripting/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Un reloj de dos colores&#8230;</title>
		<link>http://blog.48bits.com/2011/04/15/un-reloj-de-dos-colores/</link>
		<comments>http://blog.48bits.com/2011/04/15/un-reloj-de-dos-colores/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 20:14:57 +0000</pubDate>
		<dc:creator>inocraM</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1830</guid>
		<description><![CDATA[Desde hace algunas semanas El Pais esta publicando unos retos matematicos semanales, y entre los acertantes de cada desafio se sortea la coleccion completa de libros de matematicas que el periodico esta vendiendo cada domingo. Desde mi punto de vista el acierto de estos desafios es la eleccion de problemas que son entretenidos y asequibles [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.48bits.com/wp-content/uploads/2011/04/reloj-espiral.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2011/04/reloj-espiral.jpg" alt="" title="reloj-espiral" width="357" height="350" class="aligncenter size-full wp-image-1834" /></a><br />
Desde hace algunas semanas El Pais esta publicando unos retos matematicos semanales, y entre los acertantes de cada desafio se sortea la coleccion completa de libros de matematicas que el periodico esta vendiendo cada domingo. Desde mi punto de vista el acierto de estos desafios es la eleccion de problemas que son entretenidos y asequibles para el gran publico. Como ejemplo podemos analizar el problema de la semana pasada. Podeis ver el video del desafio <a href="http://www.elpais.com/videos/sociedad/reloj/colores/elpepusoc/20110407elpepusoc_1/Ves/">aqui</a>.<br />
<span id="more-1830"></span><br />
Comencemos poniendo una esfera ejemplo con sus numeros coloreados de azul y rojo. Tened en cuenta que esta esfera sirve solo como ejemplo, y que nosotros debemos demostrar que nuestro sistema funciona para cualquier esfera, incluida esta. </p>
<p><a href="http://blog.48bits.com/wp-content/uploads/2011/04/reloj.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2011/04/reloj.jpg" alt="" title="reloj" width="350" height="350" class="aligncenter size-full wp-image-1834" /></a></p>
<p>Si analizamos el problema proupesto, vemos que no se trata de un problema dificil. A continuacion voy a exponer una posible solucion. Tenemos que demostrar que siempre se puede dibujar una linea que corte al reloj en dos y que deje tres numeros rojos y tres numeros azules a cada lado. Nosotros vamos a demostrar que esto es asi, y ademas vamos a proponer un mecanismo que nos permitira saber cuantas soluciones existen y cuales son. </p>
<p>Vamos a comenzar imaginandonos que dibujamos una linea uniendo cada uno de los numeros de la esfera del reloj con el numero que tiene en frente. Todas estas lineas, seis en total, se cruzaran en el centro.<br />
<a href="http://blog.48bits.com/wp-content/uploads/2011/04/reloj_lineas.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2011/04/reloj_lineas.jpg" alt="" title="reloj_lineas" width="350" height="350" class="aligncenter size-full wp-image-1833" /></a><br />
El primer dato que hemos de tener en cuenta es que para cada una de estas parejas, (12,6),(1,7),(2,8), etc. los dos numeros de la pareja no pueden pertenecer al mismo lado de la solucion. Esto es asi porque todas las lineas que hemos dibujado se cruzan en el centro, y la linea solucion se cruzara con todas ellas tambien en el centro del reloj, dejando siempre un numero de la pareja a un lado, y el segundo al otro.<br />
Ahora, imaginemos que para todas estas parejas, ambos numeros tienen el mismo color. Entonces, cualquiera de las rectas que cruzando por el centro de la esfera divide el reloj en dos partes con seis numeros cada una, es una solucion del problema. Esto debe ser asi porque si para cada pareja un numero esta en un lado de la solucion y el otro esta en el otro lado de la solucion, y todas las parejas tiene los dos numeros del mismo color, entonces tenemos que encontrar necesariamente el mismo numero de digitos de cada color a ambos lados de cualquier recta que divide al realoj en dos.<br />
De todo esto deducimos una cosa importante.  Podemos ignorar las parejas que tienen los dos numeros del mismo color. Dibujemos nuestro reloj, dejando solo las rectas que representan parejas con numeros de diferentes colores:</p>
<p><a href="http://blog.48bits.com/wp-content/uploads/2011/04/reloj_lineas2.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2011/04/reloj_lineas2.jpg" alt="" title="reloj_lineas2" width="350" height="350" class="aligncenter size-full wp-image-1835" /></a></p>
<p>Ahora, pasaremos a demostrar otro detalle que es importante para llegar a la solución final. El numero de parejas con numeros de diferentes colores es siempre un numero par. Lo podemos demostrar facilmente por reduccion al absurdo. Imaginemos que existe un numero impar de parejas con numeros de diferentes color, y sea este numero k, e imaginemos que para uno de los dos colores, por ejemplo el rojo, existen n parejas con los dos numeros de colo rojo. Entonces, la cantidad de numeros rojos en la esfera debe ser: 2*n+k. Como k es impar, ese numero es impar, pero la cantidad de numeros rojos y azules en la esfera es par : 6. Por lo tanto es imposible que haya un numero impar de parejas con numeros de diferente color.</p>
<p>Ahora ya tenemos todas las piezas del puzzle. Las parejas con ambos numeros de igual color no crean desequilibrio entre las dos partes de la solucion y siempre hay un numero par de parejas con numeros de diferente color. Si elegimos un color, por ejemplo el rojo, y nos fijamos donde estan los numeros de cojor rojo de las parejas  con numeros de diferente color, siempre podemos encontrar uno o varios puntos en el que dejamos la misma cantidad de numeros rojos a un lado y otro. La paridad de parejas nos garantiza la existencia de este punto. De esta forma garantizamos que la cantidad de numeros de color rojo, y por ende de color azul, a ambos lados de la solucion coinciden. Pero ademas de demostrar que siempre hay solucion, y de haber encontrado una, tambien hemos diseñado un mecanismo que nos permite saber cuantas soluciones hay y cuales son. Para el ejemplo con el que hemos empezado, existen varias soluciones. He marcado con un circulo los numeros que limitan la zona donde encontramos soluciones.</p>
<p><a href="http://blog.48bits.com/wp-content/uploads/2011/04/soluciones.jpg"><img src="http://blog.48bits.com/wp-content/uploads/2011/04/soluciones.jpg" alt="" title="soluciones" width="350" height="350" class="aligncenter size-full wp-image-1836" /></a></p>
<p>Como podeis ver, los problemas son asequibles y entretenidos. Asi que os animo a seguir estos retos matematicos. El de esta semana es mas sencillo que el de la semana pasada ;o)<br />
Por cierto, si quereis ver otras soluciones, El Pais ha publicando algunas de ellas <a href="http://www.elpais.com/articulo/sociedad/Siempre/hay/recta/cualquier/reloj/elpepusoc/20110412elpepusoc_11/Tes">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2011/04/15/un-reloj-de-dos-colores/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Garoña rima con coña.</title>
		<link>http://blog.48bits.com/2011/03/09/garona-rima-con-cona/</link>
		<comments>http://blog.48bits.com/2011/03/09/garona-rima-con-cona/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 16:03:27 +0000</pubDate>
		<dc:creator>Ruben Santamarta</dc:creator>
				<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://blog.48bits.com/?p=1784</guid>
		<description><![CDATA[Hola mapaches! En primer lugar, pedir perdón a toda la gente que asistió a la rooted por el desastre de conferencia que perpetré. Me ha jodido de una manera que no os podéis imaginar, cuando llevas tiempo investigando algo, pones ilusión y en el último instante te sale un churro, pues es una putada bastante [...]]]></description>
			<content:encoded><![CDATA[<p>Hola mapaches!</p>
<p>En primer lugar, pedir perdón a toda la gente que asistió a la rooted por el desastre de conferencia que perpetré. Me ha jodido de una manera que no os podéis imaginar, cuando llevas tiempo investigando algo, pones ilusión y en el último instante te sale un churro, pues es una putada bastante considerable. Nervios, cansancio, y el puto video que no se veía una mierda me terminaron de desconcentrar. Creo que 50 minutos no daban para lo que tenía pensado explicar el sistema eléctrico, subestaciones, 0days, ataques a los estimadores de estado&#8230;Tenía que haber planteado la charla de otra manera :/ </p>
<p>En fin, estas cosas pasan&#8230; Estoy escribiendo un paper para explicar todo el tema, tal y como  quería, y quedarme algo más a gusto. Debería estar listo en poco tiempo. </p>
<p>Ah, se me olvidaba! A los que no les gustaba mi camisa de lesbiana leñadora, mi cresta, etc&#8230;  la próxima vez me lo comentáis en una reunión cara a cara. Que me tenéis cerca&#8230;No es un buen lugar para despotricar contra alguien un auditorio lleno de colegas <img src='http://blog.48bits.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Yo sigo empeñado en no ir rajando de los demás, mala costumbre en este país parece ser. Eso sí, si me buscas me encuentras, que estoy ya hasta los cojones de tanto subnormal.</p>
<p>Pero eso es otra historia, hoy vamos a hablar de Rap. Más concrétamente del rap que han hecho los trabajadores de Garoña&#8230;.</p>
<p><span id="more-1784"></span></p>
<p>&#8220;¿Qué sabemos de &#8216;X&#8217;? No sabemos mucho.&#8221; en este caso sustituiremos X por Garoña.</p>
<p>Y es cierto, no se mucho. De lo que me interesa saber, sería mejor especificar. Tampoco me había planteado nunca buscar info sobre Garoña, pero a raiz del rap todo cambió. No duermo tranquilo sabiendo el flow que se gastan por allí.</p>
<p>Lo primero de todo es ver el video</p>
<p><iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/51ivXkQXlB4" frameborder="0" allowfullscreen></iframe></p>
<p>que si me como una pera,que si es radioactiva, que no mola, tu alucinas etc etc</p>
<p>El video tuvo su repercusión en la <a href="http://www.publico.es/ciencias/364989/que-no-mola-es-radiactiva-oye-tio-tu-alucinas">prensa</a>, donde se comentaba el hecho de que aparecieran en imágenes ciertas partes de la central de acceso restringido. Cuando se habla de que en algo salen cosas restringidas, aunque sea un capítulo de Padres Forzosos, ese elemento ya se torna interesante.</p>
<p>Así que lo siguiente era analizar fotogramas a ver qué veíamos, y si este vídeo nos ayudaba a complementar u obtener información adicional de fuentes abiertas.</p>
<p>Al principio podemos ver las salas de la turbina, compresores, laboratorio, tornos de seguridad, uniformes usados&#8230; y a este señor<br />
<img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_1.png" alt="" title="blog_1" width="648" height="448" class="aligncenter size-full wp-image-1785" /><br />
Si por mi fuera le ponía una central nuclear para él sólo. Consigue condensar en su intervención toda la tristeza y desazón por el posible cierre. Me da penica.</p>
<p>De la parte de tornos, vemos que usan como metodo de autentificación una tarjeta (mano derecha) para acceder al pabellón donde se encuentra el circuito primario.<br />
<img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_2.png" alt="" title="blog_2" width="642" height="397" class="aligncenter size-full wp-image-1787" /><br />
En los siguientes fotogramas lo dicen directamente, pero aun así podríamos inferir que el tío iba a un lugar chungo porque:<br />
-Hay que llevar mono y cajco.<br />
-Hay que pasar un control.<br />
-Hay carteles arriba con el símbolo de radiación.</p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_3.png" alt="" title="blog_3" width="650" height="391" class="aligncenter size-full wp-image-1788" /></p>
<p>Posteriormente aparece el simulador de la sala de control, que supongo que es donde llevan a los colegios y eso.</p>
<p>Luego sale un señor encabronado con la mano en el pecho, que te mira fijamente hasta que te acojonas.<br />
<img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_4.png" alt="" title="blog_4" width="640" height="392" class="aligncenter size-full wp-image-1789" /></p>
<p>A partir de ahí, la cámara pasa a exteriores. Donde vemos la subestación,los transformadores y los shunts son de siemens. Nada raro.</p>
<p>Fijándonos en los elementos distinguibles y con la ayuda de google maps, podemos averiguar desde donde está grabada esa escena. Supongo que ese edificio sea el del turbogenerador. </p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_6.png" alt="" title="blog_6" width="646" height="393" class="aligncenter size-full wp-image-1790" /></p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_7.png" alt="" title="blog_7" width="600" height="515" class="aligncenter size-full wp-image-1791" /></p>
<p>Hasta aquí lo más interesante del video. Ahora pasamos a la empresa propietaria de Garoña, Nuclenor. <a href="http://www.nuclenor.org/">http://www.nuclenor.org/</a></p>
<p>Si le pasas la <a href="http://www.informatica64.com/DownloadFOCA/">FOCA </a>te sale que el Subdirector de Emergencias del Consejo de Seguridad Nuclear es problable que use Microsoft Office 95.</p>
<p><img src="http://blog.48bits.com/wp-content/uploads/2011/03/blog_8.png" alt="" title="blog_8" width="943" height="307" class="aligncenter size-full wp-image-1792" /> </p>
<p>Luego nos vamos a la galería fotográfica <a href="http://nuclenor.org/interior.htm">http://nuclenor.org/interior.htm</a></p>
<p>Se nos permite bajar las imágenes originales en alta resolución y con metadatos. </p>
<p>Es muy bonita esta foto<br />
<img src="http://nuclenor.org/galeria1/images/int11.jpg" alt="null" /><br />
Podemos ver el HMI de Siemens Simatic, por lo tanto Stuxnet podría haber infectado a Garoña xD Obviamente ahora también sabemos qué están usando. A mi modo de ver, no mola.</p>
<p>Si comparamos los metadatos de la foto con la hora y la fecha de las pantallas, coinciden en el tiempo.</p>
<p>También podemos observar otros sistemas de la central, distintos monitores (Samsung, no Siemens), distinto software. Usan Windows 2000.<br />
En una de las pantallas vemos el HMI de lo que parece ser el sistema de tratamiento de  gases de reserva.<br />
<img src="http://nuclenor.org/galeria1/images/int20.jpg" alt="null" /></p>
<p>Y ya está. Ya sabemos algo más de Garoña.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.48bits.com/2011/03/09/garona-rima-con-cona/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

