tag:blogger.com,1999:blog-82017313221155421792024-03-06T00:47:11.224+01:00El Blog de Daniel LerchUnknownnoreply@blogger.comBlogger119125tag:blogger.com,1999:blog-8201731322115542179.post-68804153417608680252012-07-10T19:40:00.000+02:002012-07-10T19:43:19.350+02:00Hashtables con hsearch_r y hcreate_r, hecho fácil<br />
hsearch_r(), hcreate_r() y hdestroy_r() son funciones POSIX para el manejo de hashtables. No son las más intuitivas, ni tampoco las más portables, pero el hecho de que vengan con cualquier sistema GNU y no tengas que instalarlas las hace muy cómodas.<br />
<br />
Dado que trabajar con ellas es poco práctico he creado unas macros que facilitan su uso y hacen el código más legible. Son las siguientes:<br />
<br />
<br />
<pre class="cpp" name="code">#define _GNU_SOURCE
#include <search.h>
#define HASHTABLE_CREATE(name, sz) \
struct hsearch_data *name = calloc(sz, sizeof(struct htsearch_data*)); \
hcreate_r(sz, name);
#define HASHTABLE_DESTROY(name) hdestroy_r(name)
#define HASHTABLE_SET(name, strkey, value) \
{ \
ENTRY e, *r; \
e.key = strkey; \
if(hsearch_r(e, FIND, &r, name)) \
{ \
r->data = (void*) (value); \
} \
else \
{ \
e.data = (void*) (value); \
hsearch_r(e, ENTER, &r, name); \
} \
}
#define HASHTABLE_GET(name, strkey, value) \
{ \
ENTRY e, *r; \
e.key = strkey; \
if(hsearch_r(e, FIND, &r, name)) \
{ \
value=(int)r->data; \
} \
else \
{ \
value=(int)0; \
} \
}
</pre>
Pegando este código en el programa, se pueden usar fácilmente hashtables, como se muestra en el ejemplo:<br />
<br />
<br />
<br />
<pre class="cpp" name="code"> HASHTABLE_CREATE(ht, 100);
HASHTABLE_SET(ht, "e1", 1);
HASHTABLE_SET(ht, "e2", 2);
HASHTABLE_SET(ht, "e3", 3);
HASHTABLE_SET(ht, "e4", 4);
HASHTABLE_SET(ht, "e5", 5);
int i;
HASHTABLE_GET(ht, "e1", i);
printf("val: %d\n", i);
HASHTABLE_GET(ht, "e2", i);
printf("val: %d\n", i);
HASHTABLE_GET(ht, "e3", i);
printf("val: %d\n", i);
HASHTABLE_GET(ht, "e4", i);
printf("val: %d\n", i);
HASHTABLE_DESTROY(ht);
</pre>
<br />
Como se ve, el ejemplo es muy sencillo. Primero creamos una estructura con espacio para 100 elementos (caben más, pero habrá colisiones y no será óptimo). Después añadimos elementos, y posteriormente los consultamos. Finalmente, eliminamos la estructura.<br />
<br />
A tener en cuenta que HASHTABLE_GET almacena el resultado en "i", lo cual puede confundir un poco al leer el código.<br />
<br />
Las macros están hechas para trabajar con valores enteros, pero son fácilmente modificables.<br />
<br />
<br />
<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-43696622368939314552012-01-26T18:33:00.000+01:002012-01-27T15:25:29.623+01:00Sockets multiplataforma con GTK+<div style="text-align: justify;">
<a href="http://dlerch.blogspot.com/2012/01/compila-en-linux-y-ejecuta-en-windows.html">Recientemente</a> hemos visto como realizar compilación cruzada con GTK+. Esto nos permite escribir aplicaciones que se ejecutan en diferentes plataformas, almenos a nivel gráfico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vamos a ver ahora como usar sockets TCP, algo que habitualmente suele estar muy ligado a una plataforma concreta. GTK+ (de hecho es GLIB) nos proporciona una API para acceder a la red. Esta API, al igual que GTK+ es multiplataforma.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Escribiremos un cliente TCP sencillo, que se conectará a un puerto, escribirá un mensaje, y leerá la respuesta.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Primero incluimos las cabeceras habituales en un programa C, junto con las cabeceras de GTK+.</div>
<div style="text-align: justify;">
<br /></div>
<pre class="cpp" name="code">#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
</pre>
<div style="text-align: justify;">
<br />
Necesitamos las siguientes variables;</div>
<div style="text-align: justify;">
<br /></div>
<pre class="cpp" name="code">GError *err = NULL;
GSocket *sock = NULL;
GInetAddress *iaddr = NULL;
GSocketAddress *saddr = NULL;
GCancellable *cancel = NULL;
</pre>
<div style="text-align: justify;">
<br />
Usamos las siguientes funciones para inicializar las variables que contienen las direcciones de red. Lògicamente con la IP y puerto que convenga:<br />
<br />
<pre class="cpp" name="code">g_type_init();
iaddr = g_inet_address_new_from_string("192.168.1.1");
saddr = g_inet_socket_address_new(iaddr, 23);
</pre>
<br />
Abrimos el socket y nos conectamos a el:<br />
<br />
<pre class="cpp" name="code">sock = g_socket_new(
G_SOCKET_FAMILY_IPV4,
G_SOCKET_TYPE_STREAM,
G_SOCKET_PROTOCOL_TCP,
&err);
f(!g_socket_connect(sock, saddr, cancel, &err))
{
printf("Cannot connect\n");
return -1;
}
</pre>
<br />
Y finalmente, enviamos y recibimos datos:<br />
<br />
<pre class="cpp" name="code"> char buf[256];
strncpy(buf, "lst\n", sizeof(buf));
g_socket_send(sock, buf, strlen(buf), cancel, &err);
g_socket_receive(sock, buf, sizeof(buf), cancel, &err);
printf("received:\n%s\n", buf);
</pre>
<br /></div>
<br />
Sencillo, ¿no?<br />
<br />
<br />Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-8201731322115542179.post-68620656684306701602012-01-25T17:25:00.000+01:002012-01-25T17:25:31.283+01:00Sockets TCP con Bash<div style="text-align: justify;">
Es muy habitual, cuando se escriben scripts en Bash, recurrir a herramientas como "netcat" para realizar comunicaciones de red. Sin embargo, aunque no es muy conocido, Bash soporta sockets.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Veamos como conectarnos, por ejemplo, a google.</div>
<div style="text-align: justify;">
Abrimos el socket y le asociamos el descriptor 3. Recordemos que 0, 1 y 2 se usan habitualmente para la entrada y salida estándard y para la salida de error.
</div>
<br />
<pre class="cpp" name="code">$ exec 3<>/dev/tcp/www.google.com/80
</pre>
<br />
A continuación, enviamos un mensaje por el socket:
<br />
<br />
<pre class="cpp" name="code">$ echo "GET /" >&3
</pre>
<br />
Y finalmente, leemos la respuesta del servidor:<br />
<br />
<pre class="cpp" name="code">$ cat <&3
HTTP/1.0 302 Found
Location: http://www.google.es/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=a38d7ed8770f70cb:FF=0:TM=1327418982:LM=1327418982:S=0tgHEV7GxJaC6Wl7; expires=Thu, 23-Jan-2014 15:29:42 GMT; path=/; domain=.google.com
Date: Tue, 24 Jan 2012 15:29:42 GMT
Server: gws
Content-Length: 218
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
... </pre>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-49870400740859720522012-01-24T15:14:00.000+01:002012-01-24T15:49:35.027+01:00Compila en Linux y ejecuta en Windows con GTK+<div style="text-align: justify;">
Vamos a ver como realizar una compilación cruzada con las librerías de GTK+. Esto nos permitirá compilar el programa en Linux y ejecutarlo en Windows, por lo que podremos tener programas funcionando en Windows sin tener que usarlo. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo primero que tenemos que hacer es instalar el compilador mingw. En mi distribución vale con:<br />
<br />
<pre class="cpp" name="code">sudo apt-get install mingw32
</pre>
<br />
A continuación tenemos que descargar las librerías necesarias de windows en nuestro Linux. Podemos encontrarlas en</div>
<div style="text-align: justify;">
<br /></div>
<pre class="cpp" name="code">$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib-dev_2.28.8-1_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/atk/1.32/atk-dev_1.32.0-2_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/pango/1.29/pango-dev_1.29.4-1_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo-dev_1.10.2-2_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libpng-dev_1.4.3-1_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-dev_0.18.1.1-2_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-dev_2.24.8-1_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/fontconfig-dev_2.8.0-2_win32.zip
$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/gdk-pixbuf/2.24/gdk-pixbuf-dev_2.24.0-1_win32.zip
</pre>
<div style="text-align: justify;">
Descomprimiremos los zip dentro del directorio donde se instala mingw. Habitualmente:<br />
<pre class="cpp" name="code">/usr/i586-mingw32msvc/</pre>
<pre></pre>
Entramos en dicho directorio y realizamos algunos ajustes:<br />
<br />
<pre class="cpp" name="code">sed -i 's|^prefix=.*$|prefix=/usr/i586-mingw32msvc|g' lib/pkgconfig/*.pc
cd ./lib
for f in *.lib;
do mv $f lib${f%%lib}a;
done
</pre>
</div>
<div style="text-align: justify;">
<br />
En mi caso faltaba un archivo en pkgconfig, lo he corregido con:<br />
<br />
<pre class="cpp" name="code">$ cp /usr/lib/i386-linux-gnu/pkgconfig/freetype2.pc pkgconfig/
</pre>
<br />
Pero podría estar ubicado en otro sitio en otras distros. <br />
<br />
Llegados a este punto ya deberíamos poder compilar tanto para windows como para linux.<br />
<br />
Si compilamos con el siguiente comando: <br />
<br />
<pre class="cpp" name="code">i586-mingw32msvc-gcc main.c `PKG_CONFIG_LIBDIR=/usr/i586-mingw32msvc/lib/pkgconfig PKG_CONFIG_PATH=/usr/i586-mingw32msvc/lib/pkgconfig pkg-config --cflags --libs gtk+-2.0`
</pre>
<br />
generaremos un ejecutable para Windows. En este caso "a.exe".<br />
<br />
Y si compilamos con este comando:<br />
<br />
<pre class="cpp" name="code">gcc main.c `pkg-config --cflags --libs gtk+-2.0 gmodule-export-2.0`
</pre>
<div style="text-align: justify;">
<br /></div>
</div>
<div style="text-align: justify;">
Obtendremos un ejecutable para Linux "a.out". Ya tenemos pues, nuestro sistema de compilación cruzada preparado.</div>
<br />
Ya podemos trasladar nuestro ejecutable a Windows y probarlo. Para que funcione es necesario haber instalado <a href="http://sourceforge.net/projects/gtk-win/">GTK+ para Windows</a>.<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-48562774404193019602012-01-21T12:04:00.002+01:002012-01-21T12:04:19.108+01:00Esteganografía LSB en imágenes bitmap<div style="text-align: justify;">
Uno de los métodos más populares de Esteganografía consiste en modificar el valor del bit menos significativo de cada píxel, el LSB (Least Significant Bit). En este artículo vemos como hacerlo en imágenes de tipo bitmap, es decir, aquellas que estan estructuradas como matrices de números donde cada número representa un píxel (eso solo es cierto en imágenes en escala de grises. En imágenes en color existen varias representaciones como la RGB donde cada píxel está representado por tres valores, correspondientes a la cantidad de color rojo, la cantidad de color verde y la cantidad de color azul).<br />
<br />
El motivo de usar el LSB es que su alteración no sueles ser perceptible visualmente (a menos que la imagen sea muy baja resolución) </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Inserción secuencial:</b> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El método más sencillo consiste en separar los bytes que forman el mensaje en bits individuales. A continuación se recorren los píxeles de la imagen modificando su LSB de manera que quede igual que el del mensaje. Supongamos que queremos esconder un mensaje que empieza por 'H'. El valor en binario de la letra 'H' es 1001000. Por lo tanto tendremos que insertar:</div>
<br />
<div style="text-align: center;">
<span style="font-size: large;">1 0 0 1 0 0 0</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Imaginemos ahora que los primeros 8 píxeles de la imagen corresponden a los bytes:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: large;">100 101 101 102 102 101 103</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: justify;">
El primer píxel, correspondiente al valor 100 se representa en binario como 1100100. Dado que tenemos que modificar su LSB y ponerlo a uno, como el primer bit del mensaje, tendremos 1100101, que corresponde al valor de píxel 101. La operación es muy sencilla, si tenemos un valor de píxel par y queremos insertar un cero, no modificaremos el valor del píxel, pero si queremos insertar un uno, le sumaremos uno. Si por el contrario tenemos un píxel impar y queremos insertar un uno, no modificaremos su valor, pero si queremos insertar un cero, le restaremos uno.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Así, el primer byte queda como 101, el segundo como 100, el tercero como 100, etc</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
</div>
<div style="text-align: center;">
<span style="font-size: large;">101 100 100 103 102 100 102</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Para leer el mensaje solo tendremos que extraer los LSB de todos los píxeles.</div>
<br />
<br />
<br />
<b>Inserción aleatoria:</b><br />
<div style="text-align: left;">
<br /></div>
<div style="text-align: justify;">
Insertar el mensaje de forma secuencial no es una forma muy acertada de hacerlo. Esto permite al atacante extraer el mensaje, por lo que, si no está cifrado, solo tiene que verificar que es legible (en una imagen sin mensaje oculto no lo sería).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por este motivo es más aconsejable usar un <a href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator">generador pseudoaleatorio PRNG</a> basado en una clave o contraseña, que eliga aleatoriamente los píxels en los que incrustar datos. De esta manera no bastaría con una simple extracción de todos los LSB.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<b>Reducción del bitrate</b><b>:</b><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aún y la enorme dificultad de conseguir el mensaje que ha sido ocultado usando un PRNG (necessitaríamos adivinar la contraseña), el objetivo de la esteganografía es hacer el mensaje indetectable, no indescifrable (de eso se encarga la criptografía). Por ello tenemos que intentar que la distribución estadística de los píxeles de la imagen se vea alterada lo menos posible. Si usamos bitrate 1, es decir, si modificamos todos los píxeles de la imagen, la distribución estadística se verá tan alterada que sermoes detectados sin demasiada dificultad. Por ello es conveniente reducir en la medida de lo posible el bitrate de inserción.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Los ataques existentes en la actualidad a los sistemas LSB son tan sofisticados que detectan alteraciones por encima de bitrates de 0,03. Es decir, que si no queremos ser detectados, deberíamos modificar como mucho el 3% de la imagen y hacerlo de forma aleatoria.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-77240516507279697052012-01-20T22:28:00.001+01:002012-01-20T22:39:35.422+01:00Introducción a Arduino Ethernet: Hello World<div style="text-align: justify;">
<a href="http://www.arduino.cc/">Arduino</a> es una plataforma de Hardware abierto cada vez más popular. Permite, de forma sencilla, realizar montajes electrónicos y programarlos. Recientemente ha aparecido en escena Arduino Ethernet, que a diferencia de los anteriores (Arduino Uno y Arduino Duemilanove, entre otros) tiene conexión RJ45 y soporte TCP/IP.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdZRHJXLAQjjdmiwjBH959lxAyvQkJiDP9hz33yvJNCb0HnVYExdblL8joUW3gwzMCx8b_r1MmF_FBwF-3YK1aJVGzTzPK402YNGxWsaWsgKwfjD8bG8RTouGjWkdH8Nj9PRL4wIEoTR-u/s1600/Arduino_ETH_senza_POE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdZRHJXLAQjjdmiwjBH959lxAyvQkJiDP9hz33yvJNCb0HnVYExdblL8joUW3gwzMCx8b_r1MmF_FBwF-3YK1aJVGzTzPK402YNGxWsaWsgKwfjD8bG8RTouGjWkdH8Nj9PRL4wIEoTR-u/s320/Arduino_ETH_senza_POE.jpg" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En este post vamos a realizar una breve introducción a Arduino Ethernet, viendo como dar los primeros pasos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>El programador:</b> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A difernecia de los arduinos anteriores, que tenían una conexión USB que permitía cargar el firmware y depurar, el Arduino Ethernet solo tiene la conexión RJ45. Por ello es necesario usar el conector de la foto para programarlo:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ICFz2EvtJJfsDMGEK0VPlQ3WPd1LjTDu3HNxbEI-AEdeWxNvjnStIbRxqnNrePoGfw81PegCdbQh0pJ2pmyKaS59Kfcn3CP94kOnwaZL3MGlWnD79JgAgpjoyuqnj8N9bGkoZ75sTtON/s1600/Arduino_ETH_senza_POE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ICFz2EvtJJfsDMGEK0VPlQ3WPd1LjTDu3HNxbEI-AEdeWxNvjnStIbRxqnNrePoGfw81PegCdbQh0pJ2pmyKaS59Kfcn3CP94kOnwaZL3MGlWnD79JgAgpjoyuqnj8N9bGkoZ75sTtON/s320/Arduino_ETH_senza_POE.jpg" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para poder usar este conector es necesario usar un programador. Existen multitud en el mercado. Por ejemplo <a href="http://store.atmel.com/PartDetail.aspx?q=p:10500054">este de Atmel</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra opción más económica consiste en usar el<a href="http://arduino.cc/en/Main/USBSerial"> adaptador a USB</a>. </div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjiIblb6gIyDm5oyOIPeI_l7SOu9V3N7ottqrfKen9gSteREh8Q-cU0Z-8rdIJpkCH_vmfQPRBlKR4fUqUkvB8CRFEf79AaGO0HODdUlOmrJIYZIVhUNBzxZyXvT1NQ6BYZMSIoc0K17Qc/s1600/USBSerial.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjiIblb6gIyDm5oyOIPeI_l7SOu9V3N7ottqrfKen9gSteREh8Q-cU0Z-8rdIJpkCH_vmfQPRBlKR4fUqUkvB8CRFEf79AaGO0HODdUlOmrJIYZIVhUNBzxZyXvT1NQ6BYZMSIoc0K17Qc/s320/USBSerial.jpg" width="320" /></a></div>
<div style="text-align: justify;">
<b>El programa:</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El programa más sencillo que se puede hacer con Arduino, y que nos muestre su funcionamiento, es hacer parpadear un led. Concretamente el led 13, que es el único que tiene. Seria el equivalente al típico "Hello World". El programa es el siguiente:</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<pre class="cpp" name="code">void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
</pre>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El entorno de Arduino llama a la función setup() al iniciar. Aprovechamos esta función para configurar el pin 13 como salida. La función loop() es llamada indefinidamente, por lo que en ella ponemos el cuerpo del programa. Lo que hacemos es encender el led, esperar un segundo, apagar el led y esperar de nuevo. <br />
<br />
<b>Cargar el firmware:</b></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una vez tenemos el programa podemos cargarlo al Arduino de dos formas, en función de si disponemos del adaptador USB o del programador. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el primer caso podemos usar <a href="http://arduino.cc/en/Main/Software">el software de Arduino</a>. Es la forma más sencilla, simplemente escribimos el programa en el entorno de programación y lo cargamos con la opción "Upload". </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy4h_HmTdGMs_t959CAMZMk43gwzDyZnaa1ehoIlUetEfsmFjMn5WlLO5U3nHXgZ-TvDqGEioxeKYsYaRPtCIPvk-P2sCWmllEBHD4lnvwyZWAoZzgPHb7agNyatAakgztg7nWiEcOrbEd/s1600/300px-Arduino-ide-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy4h_HmTdGMs_t959CAMZMk43gwzDyZnaa1ehoIlUetEfsmFjMn5WlLO5U3nHXgZ-TvDqGEioxeKYsYaRPtCIPvk-P2sCWmllEBHD4lnvwyZWAoZzgPHb7agNyatAakgztg7nWiEcOrbEd/s320/300px-Arduino-ide-3.jpg" width="289" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si queremos usar el programador, la forma más sencilla de hacerlo consiste en usar el entorno de programación de Arduino para compilar el programa y el programa avrdude para subir el firmware. Podemos hacerlo con el siguiente comando:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<pre class="cpp" name="code">sudo avrdude -c avrispmkII -p m328p -u -U flash:w:firmware.hex -P usb
</pre>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Donde firmware.hex es el archivo generado por el entorno de programación de Arduino.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Resultados:</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si todo ha funcionado como es debido, veremos como el led de la placa parpadea. Ya tenemos nuestro "Hello World"!</div>
<div style="text-align: justify;">
<br /></div>
<br />Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-8201731322115542179.post-4610535745320208312012-01-19T22:02:00.001+01:002012-01-20T17:48:09.451+01:00Esteganografía moderna<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La primera aparición de la Esteganografía en medios digitales la realizó G. J. Simmons en 1983 [1]. En el se habla de las posibles implicaciones políticas de enviar datos a través de canales encubiertos y se plantea el problema del prisionero.
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>El problema del prisionero:</b> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Alice y Bob son encarcelados en celdas separadas. Pueden comunicarse y quieren planear una fuga, pero sus mensajes son monitorizados por el carcelero Eve. Si Eve descubre que Alice y Bob están intercambiando mensajes secretos no dejará que vuelvan a comunicarse. Por ello, Alice y Bob recurren a la Esteganografía para comunicarse. <br />
<br />
En el problema el prisionero hay que destacar que Eve cortará la comunicación si detecta que Alice y Bob se comunican de manera secreta. No es necesario que Eve tenga acceso al mensaje, sólo que lo detecte. Así, un sistema de <b>Esteganografía</b> se considerará roto si puede ser detectada la existencia de un mensaje. No es necesario acceder a su contenido, esto formaría parte del<b> Estegoanálsisis forense</b> (extracción del mensaje) y del <b>criptoanálisis</b> (descifrado del mensaje).
</div>
<div style="text-align: justify;">
<br /></div>
<br />
<div style="text-align: justify;">
En el problema del prisionero se asume que Eve conoce el algoritmo usado para esconder los datos pero no la clave. Este es un requisito tomado de la Criptografía, que forma parte de los conocidos <a data-mce-href="http://en.wikipedia.org/wiki/Kerckhoffs's_principle" href="http://en.wikipedia.org/wiki/Kerckhoffs%27s_principle">Principios de Kerchhoff</a>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Referencias:</b> </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
[1] G. J. Simmons. The prisoner's problem and the subliminal channel. D. Chaum editor, advances in Criptology, CRYPTO '83, pages 51-67, Santa Barbara, CA, August 22-24, 1983. New York: Plenum Press.<br />
<br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-71135105241613025872010-12-29T17:07:00.001+01:002012-01-20T09:26:10.585+01:00Control del Árbol de Navidad con OpenDomo<div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Vemos en OpenDomo un video donde se muestra paso a paso como usar el <a href="http://opendomo.com/main/products">Kit de desarrollo de OpenDomo</a> para controlar un árbol de Navidad. Aunque serviría para controlar cualquier dispositivo eléctrico.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Os dejo la <a href="http://es.opendomo.org/node/261">URL del video</a>.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-84925171023359799872010-11-11T20:00:00.000+01:002012-01-19T23:48:14.557+01:00CryptolandCryptograms, puzzles, programming and other challenges.<br />
<br />
<a href="http://twitter.com/#!/cryptoland">http://twitter.com/#!/cryptoland</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-40832654310649217922010-06-13T13:31:00.004+02:002012-01-20T09:26:10.577+01:00OpenDomo 0.8.3 publicado<div style="text-align: justify;">La versión <a href="http://opendomo.googlecode.com/files/opendomo-0.8.3-486.iso">0.8.3</a> de OpenDomo ha visto la luz recientemente. Para el que todavía no lo sepa, OpenDomo es un sofware de domótica completamente libre, que permite entre otras cosas, controlar dispositivos eléctricos o disponer de un sistema de videovigilancia. Así que si no lo has probado todavía, a qué esperas!!!<br /></div><br /><div style="text-align: justify;">A continuación dejo una lista de los cambios más importantes, respecto a la versión anterior.<br /></div><br /><p style="text-align: justify;">La distribución incluye:</p> <ul style="text-align: justify;"><li>Kernel linux versión 2.6.33</li><li>Kit de herramientas <a href="http://www.busybox.net/" target="_blank">busybox</a> versión 1.16.1 (toolchain actualizado a 2010.05)</li><li><a href="http://es.opendomo.org/odpkg" title="Administrador de paquetes">odpkg</a>, <a href="http://es.opendomo.org/odcgi" title="Interfaz web">odcgi</a>, <a href="http://es.opendomo.org/odcommon" title="Archivos comunes">odcommon</a> y <a href="http://es.opendomo.org/oddiscovery" title="Sincronización de la red OpenDomo">oddiscovery</a> preinstalados en el sistema base</li></ul> <p style="text-align: justify;">Además de incluir gran parte de los paquetes habituales, las principales novedades son:</p> <ul style="text-align: justify;"><li>Nueva arquitectura de gestión de discos con <strong>libata</strong>, el nuevo controlador del kernel de linux</li><li>Múltiples actualizaciones de las herramientas del sistema base, con importantes mejoras de estabilidad</li><li><a href="http://es.opendomo.org/cherokee" title="Cherokee">Cherokee</a> incluido en el repositorio local, para un mayor rendimiento y seguridad en las conexiones</li><li>Nuevo formato unificado de configuración, empezando por los archivos <a href="http://es.opendomo.org/system-network" title="Configuración de red">network.conf</a> y <a href="http://es.opendomo.org/opendomo.cfg" title="Archivo de configuración opendomo.cfg">opendomo.cfg</a>, afectando también a la <a href="http://es.opendomo.org/odvideo" title="Videovigilancia">videovigilancia</a></li><li>Scripts de uso común optimizados para un máximo rendimiento en equipos pequeños</li><li>División por zonas soportada por <a href="http://es.opendomo.org/odvideo" title="Videovigilancia">odvideo</a> y <a href="http://es.opendomo.org/odcontrol" title="Control de dispositivos">odcontrol</a>, permitiendo configurar las cámaras y dispositivos que se encuentran en cada una de ellas</li><li style="text-align: justify;">Actualización manual desde ISO soportada, permitiendo una mejor transición entre versiones</li><li style="text-align: justify;"><a href="http://es.opendomo.org/odcgi" title="Interfaz web">Interfaz web</a> parcialmente reescrita incorporando funciones complementarias en Javascript. Scripts de configuración de la interfaz integrados y temas visuales renovados. Caché habilitada, reduciendo en un 20% la transferencia por HTTP</li><li style="text-align: justify;">Posibilidad de almacenar librerías y archivos log en disco, permitiendo la instalación de paquetes de gran tamaño sin riesgo de agotar el ramdrive</li><li style="text-align: justify;">Mejoras en la gestión de almacenaje, permitiendo el arranque desde CD/ISO, almacenando la configuración en disco</li></ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-17959538147470872092010-06-10T20:00:00.000+02:002012-01-19T23:36:19.432+01:00Acceso 'tipo BSD' al histórico de Bash<div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Una cosa que siempre añoré de la shell de los sistemas BSD es la posiblidad de recorrer el histórico de comandos que empiezan con los caracteres tecleados en consola. En ocasiones mucho más práctico que el Ctrl+R habitual de Bash.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Pues bien, ahora puedo tenerlos los dos :)</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Solo es necesario añadir a /etc/inputrc estas dos lineas.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">"\e[5~": history-search-backward</span></span></div><div style="text-align: justify;"><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">"\e[6~": history-search-forward</span></span></div><div><br />
</div><br />
<div style="text-align: justify;">Lo que le dará a Bash esta interesante funcionalidad con las teclas RePag y AvPag.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8201731322115542179.post-6580363886968129992010-05-30T23:00:00.002+02:002012-01-19T23:51:21.686+01:00Criptograma 30/05/010<div style="text-align: center;"><span style="font-family:courier new;"><br />CSQSQ TLTDR UTOHT CRVHP WYETU SWSHT RYSHP </span><br /><span style="font-family:courier new;">LETYT OSVSW RHHPW YETRE LTOCT PVHCT PV</span><span style="font-family:courier new;">XXX</span></div><div style="text-align: right;"><br /><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-18928706629707818482010-02-19T08:27:00.000+01:002012-01-19T23:51:21.610+01:00Criptograma 19/02/10Después de algun tiempo de descanso, vamos con uno de facilito:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"> LDDOF ENADR AOCSL ASSGX APENU GZLEO DDYEL CAAAR HALSE AATMU </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> INAOA LMTIA URAUR DRAIC NEDLH ASORM MTNSZ OLSSH AIAOO AACEO </span>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-8201731322115542179.post-91623990211242390062009-12-31T13:46:00.001+01:002012-01-19T23:51:21.735+01:00Criptograma 30/07/09: SoluciónViendo que acaba el año y el criptograma continúa inexpugnable, aquí os dejo la solución.<br />
<br />
CIFRADO:<br />
BPJTALUJBPUPRFBIISASIYRTJTMSAKGMCPCRRPPBALC<br />
AAKTPSOCUPFAPKIFKRNOPRSKABPUPSMDFSOKETCPFCP<br />
<br />
CLAVE:<br />
CRISIS<br />
<br />
MENSAJE:<br />
EN LOS MOMENTOS DE CRISIS SOLO LA IMAGINACION<br />
ES MAS IMPORTANTE QUE EL CONOCIMIENTO<br />
ALBERT EINSTEIN<br />
<br />
<br />
Aprovecho para desearos un feliz comienzo de año!Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8201731322115542179.post-46485057970632753532009-10-25T18:24:00.004+01:002012-01-19T23:51:21.644+01:00Criptograma 30/07/09: PistaDado que se resiste, y ni el increible Altair consigue dar con la solución, ahí va una pista.<br /><br />Se trata de un cifrado Playfair.<br /><br /><a href="http://dlerch.blogspot.com/2009/07/criptograma-300709.html">Criptograma 30/07/09</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-77499524746956629942009-10-25T18:18:00.002+01:002012-01-19T23:51:21.709+01:00Criptograma 16/07/09: SoluciónCada par de letras del criptograma correspondía a una letra del mensaje en claro. Tomando esto como hipótesis se podía recurrir a un análisis de frecuencias tradicional.<br /><br />Enhorabuena Altair.<br /><br /><span style="font-family: courier new;">HO LA BU HO DE MI MA HO LA SI TU MA </span><br /><span style="font-family: courier new;">E S M E J O R E S T A R </span><br /><br /><span style="font-family: courier new;">CE TU NA NA TU BI MI CI RU TU MA HO</span><br /><span style="font-family: courier new;">C A L L A D O Y P A R E </span><br /><br /><span style="font-family: courier new;">CE HO MA SI MI RU SI MI RE FA HO DO </span><br /><span style="font-family: courier new;">C E R T O N T O Q U E H </span><br /><br /><span style="font-family: courier new;">TU BL NA TU MA CI BI HO LA RU HO SS</span><br /><span style="font-family: courier new;">A B L A R Y D E S P E J</span><br /><br /><span style="font-family: courier new;">TU MA NA TU LA BI FA BI TU LA BI HO </span><br /><span style="font-family: courier new;">A R L A S D U D A S D E </span><br /><br /><span style="font-family: courier new;">GR UX RU UX SI UX GU TU BU HO RU SI</span><br /><span style="font-family: courier new;">F I N I T I V A M E N T</span><br /><br /><span style="font-family: courier new;">HO RR MA MI FA YY MI BU TU MA YY</span><br /><span style="font-family: courier new;">E G R O U X O M A R X</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-53770976557540360612009-09-04T10:02:00.003+02:002012-01-19T23:22:23.667+01:00ssh en batch sin expect<div style="text-align: justify;">Ssh y scp no permiten pasar la contraseña como parámetro, lo que complica las cosas a la hora de automatizar tareas. Normalmente se suele recurrir a dos tipos de soluciones: distribuir claves sin password y/o usar expect. La primera no siempre es posible, pues a veces no se tiene el control del servidor. La segunda es más habitual, aunque en ocasiones no se dispone de 'expect', problema con el que me he encontrado recientemente en el proyecto <a href="http://www.opendomo.org/">OpenDomo</a>.</div><div style="text-align: justify;"></div><div style="text-align: justify;"><br />
<br />
Como consecuencia he desarrollado la herramienta sshbatch, que permite realizar comandos ssh y scp pasando la passwd como parámetro.</div><div style="text-align: justify;"></div><div style="text-align: justify;"><br />
<br />
Dejo <a href="http://code.google.com/p/opendomo/source/browse/trunk/opendomo-discovery/src/sshbatch.c">aquí</a> una copia del programa en C y un enlace al grupo de OpenDomo donde expliqué <a href="http://groups.google.es/group/opendomo/browse_thread/thread/23674a43ca7b301b">como funciona</a>.</div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-37152280192731451532009-08-16T08:22:00.013+02:002012-01-19T23:10:33.122+01:00Cómo funciona el exploit sock_sendpage()<div style="text-align: justify;"> </div><div style="text-align: justify;">Tavis Ormandy y Julien Tinnes, del equipo de seguridad de Google, han descubierto un bug en el kernel Linux que nadie ha sido capaz de ver en los últimos ocho años. Este bug, que afecta a todas las versiones del kernel desde la 2.4.4 a la 2.4.37.4 y desde la 2.6.0 a la 2.6.30.4 permite escalar privilegios en el sistema. En este artículo vamos a analizar su funcionamiento.</div><div style="text-align: justify;"></div><div style="text-align: justify;"><br />
<br />
<b>Primer error:</b></div><div style="text-align: justify;"></div><div style="text-align: justify;">Todo comienza en la función <i>sock_sendpage()</i> situada en <i>net/socket.c</i>. El problema reside en la llamada a sendpage() pues no se ha verificado que el puntero esté inicializado.<br />
<br />
<br />
<pre class="cpp" name='code'>static ssize_t sock_sendpage(struct file *file, struct page *page,
int offset, size_t size, loff_t *ppos, int more)
{
struct socket *sock;
int flags;
sock = file->private_data;
flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT;
if (more)
flags |= MSG_MORE;
return sock->ops->sendpage(sock, page, offset, size, flags);
}
</pre><br />
<br />
A continuación, dejo una copia de la función <i>sock_splice_read</i>() que no tiene nada que ver ni con el bug ni con el exploit, pero nos sirve para ver como se podría haber evitado la vulnerabilidad. En esta función se verifica el puntero a la función mediante <i>unlikely</i>() antes su llamada.<br />
<br />
<br />
<pre class="cpp" name='code'>static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
struct pipe_inode_info *pipe, size_t len,
unsigned int flags)
{
struct socket *sock = file->private_data;
if (unlikely(!sock->ops->splice_read))
return -EINVAL;
return sock->ops->splice_read(sock, ppos, pipe, len, flags);
}
</pre><br />
<br />
<b>Segundo error:</b><br />
</div><div style="text-align: justify;">Hemos visto que no se verifica si el puntero a <i>sendpage</i>() esta correctamente inicializado. Sera necesario ahora, encontrar situaciones en las que el puntero a la función <i>sendpage</i>() no se haya inicialiado.<br />
<br />
Tavis Ormandy y Julien Tinnes en su investigación localizaron deficiencias en la incialización del puntero para la macro SOCKOPS_WRAP, definida en include/linux/net.h, que incluye PF_APPLETALK, PF_IPX, PF_IRDA, PF_X25 y PF_AX25. Tambien encontraron deficiencias en otros protocolos como PF_BLUETOOTH, PF_IUCV, PF_INET6 (con IPPROTO_SCTP), PF_PPPOX y PF_ISDN.<br />
<br />
<br />
Veamos por ejemplo el caso del protocolo bluetooth. En <i>net/bluetooth/bnep/sock.c </i>nos encontramos con la estructura <i>bnet_sock_ops</i> en la que vemos que no se inicializa <i>sendpage</i> con <i>sock_no_sendpage(</i>), por lo que quedará apuntando a NULL. <br />
<br />
<pre class="cpp" name='code'>static const struct proto_ops bnep_sock_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.release = bnep_sock_release,
.ioctl = bnep_sock_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = bnep_sock_compat_ioctl,
#endif
.bind = sock_no_bind,
.getname = sock_no_getname,
.sendmsg = sock_no_sendmsg,
.recvmsg = sock_no_recvmsg,
.poll = sock_no_poll,
.listen = sock_no_listen,
.shutdown = sock_no_shutdown,
.setsockopt = sock_no_setsockopt,
.getsockopt = sock_no_getsockopt,
.connect = sock_no_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.mmap = sock_no_mmap
};
</pre><br />
<br />
El caso de SOCKOPS_WRAP es mas sutil, pues en <i>net/ipx/af_ipx.c</i> todo parece correcto. Podemos ver la inicialización en la última linea. <br />
<br />
<br />
<pre class="cpp" name='code'>static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {
.family = PF_IPX,
.owner = THIS_MODULE,
.release = ipx_release,
.bind = ipx_bind,
.connect = ipx_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.getname = ipx_getname,
.poll = datagram_poll,
.ioctl = ipx_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = ipx_compat_ioctl,
#endif
.listen = sock_no_listen,
.shutdown = sock_no_shutdown, /* FIXME: support shutdown */
.setsockopt = ipx_setsockopt,
.getsockopt = ipx_getsockopt,
.sendmsg = ipx_sendmsg,
.recvmsg = ipx_recvmsg,
.mmap = sock_no_mmap,
.sendpage = sock_no_sendpage,
};
</pre><br />
<br />
Sin embargo, si estudiamos con detenimiento la macro SOCKOPS_WRAP en <i>include/linux/net.h</i> vemos que mietras otras llamadas se inicializan correctamente, no se realiza la inicialización de <i>sendpage</i>. <br />
No pego el código por que es demasiado largo, consultar en <i>include/linux/net.h</i> y ver que la última inicialización es la de <i>mmap</i>(), olvidando <i>sendpage</i>().<br />
<br />
<br />
<br />
<b>Cómo explotarlo?</b><br />
Lo primero que necesitaremos para explotar esta vulnerabilidad es una función que podamos ejecutar en espacio de usuario que use <i>sock_sendpage</i>(). Hay muchas funciones que lo hacen, una de ellas es <i>sendfile()</i>.<br />
<br />
<br />
<br />
Tavis Ormandy y Julien Tinnes y proponen como secuencia válida de llamadas para forzar el uso de <i>sendpage()</i>, la siguiente:<br />
<br />
<pre class='cpp' name='code'>/* ... */
int fdin = mkstemp(template);
int fdout = socket(PF_PPPOX, SOCK_DGRAM, 0);
unlink(template);
ftruncate(fdin, PAGE_SIZE);
sendfile(fdout, fdin, NULL, PAGE_SIZE);
/* ... */
</pre><br />
<br />
<br />
Cuando se ejecute la función <i>sendpage</i>(), si esta no está inicializada y apunta a NULL, el kernel intentará ejecutar las instrucciones que hay en la dirección 0. Podemos aprovechar esto mapeando la dirección 0 y almacenando allí las instrucciones que queremos que ejecute el kernel. Así, cuando se intente ejecutar <i>sendpage</i>() realmente se ejecutará nuestro código en espacio de kernel. Podremos escalar privilegios haciendo que el código almecando en la dirección 0 ponga nuestros uid a cero (root).<br />
<br />
Este tipo de bugs son muy comunes en el kernel Linux y se conocen como bugs por 'NULL pointer dereference'. Ya vimos aquí uno de estos con <a href="http://dlerch.blogspot.com/2008/02/cmo-funciona-el-exploit-vmsplice.html">el exploit vmsplice</a>. <br />
<br />
<br />
En las referencias dejo un ejemplo de exploit.<br />
<br />
<br />
<br />
<b></b></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"></div><div style="text-align: justify;"><br />
<b>referencias:</b></div>- <a href="http://www.securityfocus.com/archive/1/505751">http://www.securityfocus.com/archive/1/505751</a><br />
- <a href="http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html">http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html</a><br />
- exploit: <a href='http://www.frasunek.com/proto_ops.tgz'>http://www.frasunek.com/proto_ops.tgz</a><br />
<br />
Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-8201731322115542179.post-52317378116403272442009-08-05T14:00:00.000+02:002012-01-19T23:51:21.656+01:00Criptograma Principiantes 05/08/09<div style="text-align: justify;"><br />
RJ BZR KWPSJHLMHZR CJMJLRLG LAJVJMJZR AL BK NJRNK VZWNK LG PSL BZR UWZOWKNKAZWLR LRMWJTLG UWZOWKNKR, LB UWJNLW UKQKWZ MKWUJGHLWZ PSL UKRKRL UZW KPSJ ALRHWSJWJK BK MJXJBJFKMJZG.</div><br />
<div style="text-align: right;">OLWKBA ILJNTLWO<br />
<br />
</div>Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-8201731322115542179.post-63157754835293184642009-07-30T13:48:00.002+02:002012-01-19T23:51:21.680+01:00Criptograma 30/07/09<div style="font-family: "Courier New",Courier,monospace;"></div><div style="font-family: "Courier New",Courier,monospace;">BPJTALUJBPUPRFBIISASIYRTJTMSAKGMCPCRRPPBALC</div><div style="font-family: "Courier New",Courier,monospace;">AAKTPSOCUPFAPKIFKRNOPRSKABPUPSMDFSOKETCPFCP</div><div style="font-family: "Courier New",Courier,monospace;"></div><div style="font-family: "Courier New",Courier,monospace;"> </div>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-8201731322115542179.post-25432391576264285622009-07-24T22:13:00.001+02:002012-01-19T23:34:48.155+01:00El impresionante Robot Asimo de Honda<div style="text-align: justify;"> </div><div style="text-align: justify;">Empezó siendo un robot torpón que a duras penas andaba. Después nos sorprendió subiendo escalareas... e incluso corriendo. Increible lo que estan consiguiendo los ingenieros de Honda.</div><div style="text-align: justify;"> </div><center><br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/WwP0rdh-w7Q&hl=es&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WwP0rdh-w7Q&hl=es&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></center>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-75845255160659734442009-07-16T01:08:00.001+02:002012-01-19T23:51:21.707+01:00Criptograma 16/07/09<div style="font-family: "Courier New",Courier,monospace;"></div><span style="font-family: "Courier New",Courier,monospace;"> <br />
</span><br />
<span style="font-family: "Courier New",Courier,monospace;">HOLAB UHODE MIMAH OLASI TUMAC ETUNA NATUB IMICI RUTUM </span><br />
<span style="font-family: "Courier New",Courier,monospace;">AHOCE HOMAS IMIRU SIMIR EFAHO DOTUB LNATU MACIB IHOLA </span><br />
<span style="font-family: "Courier New",Courier,monospace;">RUHOS STUMA NATUL ABIFA BITUL ABIHO GRUXR UUXSI UXGUT </span><br />
<span style="font-family: "Courier New",Courier,monospace;">UBUHO RUSIH ORRMA MIFAY YMIBU TUMAY YXXXX</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> <br />
</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> <br />
</span>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8201731322115542179.post-28980005208648691342009-07-09T08:27:00.007+02:002012-01-19T23:21:50.754+01:00Comandos útiles para Vim <br />
" las funciones de autocompletado buscan en los directorios indicados<br />
<div style="color: #93c47d;">: set path=/usr/include,/usr/local/include</div><br />
" Habilita el coloreado de sintaxis<br />
<div style="color: #93c47d;">: syntax on</div><br />
" habilita el auto indentado<br />
<div style="color: #93c47d;">: set autoindent</div><br />
" habilita el auto indentado inteligente<br />
<div style="color: #93c47d;">: set smartindent</div><br />
" Define 3 espacios para el indentado<br />
<div style="color: #93c47d;">:set shiftwidth=3</div><br />
" Convierte tabulados en espacios. Deshabilitar con :set noexpandtab <br />
<div style="color: #93c47d;">: set expandtab </div><br />
" Hace que los tabuladores sean de tres espacios <br />
<div style="color: #93c47d;">: set tabstop=3 </div><br />
" Plega bloques delimitados por {{{ }}}. Usando fdm=syntax no se necesitan marcas<br />
<div style="color: #93c47d;">: set fdm=marker </div><br />
" Establece los nivels de anidamiento para plegar código.<br />
<div style="color: #93c47d;">: set foldnestmax=1</div><br />
" Marca el parentesis/llave que abre y el que cierra al situarse encima. <br />
<div style="color: #93c47d;">: set showmatch </div><br />
" La marca habilitada con 'showmatch' dura un segundo. <br />
<span style="color: #93c47d;">: set matchtime=1 </span> <br />
<br />
" Aparecen indicadores con el numero de linea, de columna, etc. <br />
<div style="color: #93c47d;">: set ruler </div><br />
" Cuando se abre un archivo coloca el cursor en su posicion del ultimo cierre<br />
<div style="color: #93c47d;">if has("autocmd")</div><div style="color: #93c47d;"> au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")</div><div style="color: #93c47d;"> \| exe "normal! g'\"" | endif</div><div style="color: #93c47d;">endif</div><br />
" Pinta los resultados de la busqueda<br />
<div style="color: #93c47d;">: set hlsearch</div><br />
" Cierra un bloque delimitado por {{{ }}}. <br />
" Se abre pulsando el espacio sobre el bloque. <br />
<span style="color: #93c47d;">: foldclose </span> <br />
<br />
" Entra en modo insercion a continuacion de la posicion actual <br />
<span style="color: #93c47d;">a </span> <br />
<br />
" Entra en modo insercion en la posicion actual <br />
<span style="color: #93c47d;">i </span> <br />
<br />
" Deshace los cambios <br />
<span style="color: #93c47d;">u </span> <br />
<br />
" Rehace los cambios <br />
<div style="color: #93c47d;">:redo </div><br />
" Guarda los cambios <br />
<div style="color: #93c47d;">:w! </div><br />
" Guarda los cambios en el fiechero 'file' <br />
<span style="color: #93c47d;">:w! file</span> <br />
<br />
" Sale sin guardar <br />
<div style="color: #93c47d;">:q! </div><br />
" Mueve el cursor al final del fichero <br />
<span style="color: #93c47d;">G</span> <br />
<br />
" Mueve el cursor al principio del fichero <br />
<div style="color: #93c47d;">gg </div><br />
" Mueve el cursor a la linea N <br />
<div style="color: #93c47d;">N G </div><br />
" Entra en modo visual. Seleccion a nivel de columnas. <br />
<div style="color: #93c47d;">ctrl + v </div><br />
" Entra en modo visual. Seleccion de todo el texto. <br />
<div style="color: #93c47d;">ctrl + v v </div><br />
" Corta/borra el texto seleccionado <br />
<div style="color: #93c47d;">dd </div><br />
" Copia el texto seleccionado <br />
<div style="color: #93c47d;">y </div><br />
" Pega el texto del portapapeles <br />
<div style="color: #93c47d;">p </div><br />
" Sustituye from por to, pidiendo confirmacion <br />
<span style="color: #93c47d;">:%s/from/to/gc</span> <br />
<br />
" Sustituye from por to, pidiendo confirmacion de un texto seleccionado.<br />
<div style="color: #93c47d;">:'<,'>s/from/to/gc</div><br />
" Ir al principio de la linea<br />
<div style="color: #93c47d;">0</div><br />
" Ir al final de la linea<br />
<div style="color: #93c47d;">$</div><br />
" Ir a la palabra siguiente<br />
<div style="color: #93c47d;">w<br />
</div>" Busca palabras como la situada debajo del cursor<br />
<div style="color: #93c47d;">#</div><br />
" Abre la pagina man de la función sobre la que se encuentra el cursor<br />
<div style="color: #93c47d;">K</div><br />
" Salta a la definición/declaración de la variable sobre la que se encuentra el cursor<br />
<div style="color: #93c47d;">gd</div><br />
" Salta al parentesis/llave asociado al parentesis/llave sobre el que se encuentra el cursor<br />
<div style="color: #93c47d;">%</div><br />
" Abre una pestaña con el fichero 'file'<br />
<div style="color: #93c47d;">: tabnew file</div><br />
# Salta de una pestaña a otra<br />
<div style="color: #93c47d;">gt</div><br />
<br />
" Divide la ventana en dos abriendo el fichero 'file'<br />
<div style="color: #93c47d;">: split file</div><br />
" Salta de una ventana a otra<br />
<div style="color: #93c47d;">Ctrl+w w</div><br />
" Autocompleta la palabra<br />
<div style="color: #93c47d;">Ctrl + p</div><div style="color: #93c47d;">Ctrl + n</div><br />
<span style="font-size: small;"><br />
</span><br />
<span style="font-size: small;"><br />
</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8201731322115542179.post-47088829789228913022009-07-06T07:31:00.000+02:002012-01-19T23:10:33.144+01:00Estamos dentro de VMWare?<div style="text-align: justify;"></div><div style="text-align: justify;">A continuacion dejo un programa que permite detectar si nuestro servidor se encuentra dentro de una maquina virtual VMWare. Utiliza una tecnica descubierta por Ken Kato que consiste en encontrar el Backdoor I/O port. Este puerto es el que utiliza VMWare para comunicarse con la maquina virtual. Como dicho puerto no existe en un servidor normal su deteccion indica que nos encontramos bajo VMWare.</div><br />
<br />
<pre class="cpp" name="code">/*
* 4tphi-vmchk.c
* Detects if you are in a VMWare virtual machine.
*
* Written by Andrew Hintz <http://guh.nu>
* and AAron Walters
* Fortify Research Laboratories <http://4tphi.net>
*
* "Oft at the hives of his tame bees
* They would their sugary thirst appease."
*
* This program is based on info and code from:
* http://chitchat.tripod.co.jp/vmware/
* by chitchat_at_lycos.jp
*
* Notes:
* The program can be run as a normal user.
* We tested the program only in x86 Linux.
* The m4dn3ss lives on!
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/signal.h>
#if __INTSIZE == 2 /* 16 bit environment */
typedef unsigned int uint16;
typedef unsigned long uint32;
#else /* 32 bit environment */
typedef unsigned short uint16;
typedef unsigned int uint32;
#endif /* __INTSIZE */
void segfault()
{
printf("Not running inside VMware.\n");
exit(1);
}
int main()
{
uint32 verMajor, verMinor, magic, dout;
signal(SIGSEGV, segfault);
__asm__ __volatile__
(
"mov $0x564D5868, %%eax; /* magic number */"
"mov $0x3c6cf712, %%ebx; /* random number */"
"mov $0x0000000A, %%ecx; /* specifies command */"
"mov $0x5658, %%edx; /* VMware I/O port */"
"in %%dx, %%eax;"
"mov %%eax, %0;"
"mov %%ebx, %1;"
"mov %%ecx, %2;"
"mov %%edx, %3;"
: "=r"(verMajor), "=r"(magic), "=r"(verMinor), "=r"(dout)
);
if (magic == 0x564D5868)
{
printf("Running inside VMware. ");
printf("(Version %lu,%lu)\n", verMajor, verMinor);
/* I'm not really sure what the versions mean. */
}
return 0;
}
</http://4tphi.net></http://guh.nu></pre>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-8201731322115542179.post-33353440569970582062009-06-17T23:40:00.004+02:002012-01-20T09:26:10.573+01:00OpenDomo visto desde un iPod touchDejo una foto de un sistema OpenDomo controlado desde un iPod Touch, en el se accede al sistema de videovigilancia.<br />
Cortesía de Isidro, uno de los desarrolladores principales de <a href="http://www.opendomo.org/">OpenDomo</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.opendomo.com/files/ipod.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="http://www.opendomo.com/files/ipod.jpg" width="312" /></a></div><br />
<br />
<br />
Enlace original:<br />
<a href="http://www.opendomo.com/drupal/node/55">http://www.opendomo.com/drupal/node/55</a>Unknownnoreply@blogger.com0