Entradas populares

viernes, 29 de abril de 2011

'Teddy' Bautista: 'Internet salvará la cultura'


El presidente de la Sociedad General de Autores y Editores (SGAE), Eduardo Bautista, ha afirmado que "lo que va a salvar Internet es la cultura", durante su intervención en un coloquio en Madrid de la Fundación Euroamérica.


En opinión de Bautista, los nuevos fenómenos tecnológicos adquieren mayor valor gracias a las creaciones artísticas, tanto materiales como intangibles. "Su valor es de tal magnitud que no se pueden plantear nuevos modelos de negocio sin tener en cuenta este factor", ha dicho.

El presidente de la SGAE ha pedido que "trabajemos para que las redes sociales sean el mejor medio de compartir experiencias trascendentales", así como en un nuevo modelo de sociedad para el consumo de productos culturales, en el que se fijen unas reglas de juego que favorezcan el respeto y el desarrollo de la creación.

Bautista, que ha pedido que la cultura no se convierta en un arma arrojadiza entre partidos políticos, sino en una herramienta de consenso, ha destacado asimismo la "extraordinaria fuerza" del castellano como vehículo del lenguaje, "que debemos aprovechar para fortalecer la marca España en el exterior".

Al acto, organizado por la Fundación Euroamérica, también han asistido, entre otros, Enrique Cerezo, presidente de EGEDA; Juan Cruz, director adjunto a la dirección del diario El País, y el músico y productor Alejo Stivel.

La Fundación Euroamérica, con sede en Madrid, es una organización sin ánimo de lucro y financiada por empresas que tienen inversiones en América, así como la AECID y el ICEX, con el objetivo de fomentar las relaciones entre Europa y América, especialmente desde el sector privado.


miércoles, 27 de abril de 2011

Un seguro a prueba de 'tweets'


David Bisbal (1.323.200 seguidores); Alejandro Sanz (2.054.328 seguidores); Sergio Ramos (607.477 seguidores). Son tres ejemplos de personajes populares que se han visto en apuros por escribir 'tweets' comprometidos y poco afortunados. Para evitar daños en su imagen, Kiln Group estudia sacar su nueva línea de seguros contra 'tweets' polémicos.


Kiln Group, una aseguradora dependiente de la firma Lloyds, quiere proteger a las compañías de los perjuicios que causa el mal uso de las redes sociales. Cada vez son más las personas con o sin responsabilidad que rompen la política de comunicación, revelan secretos o dan mala imagen de la marca en tan solo 140 caracteres, sin tener en cuenta que todos sus mensajes en Twitter son completamente públicos.


Las grandes compañías que contraten este nuevo seguro pagarán entre 100.000 y 10 millones de dólares para acceder a la cobertura de su marca, aunque habrá tarifas más baratas para otro tipo de asegurados.


Multas de medio millón de dólares


Un ejemplo claro de este síndrome y sus consecuencias con costes monetarios tuvo lugar en 2009, cuando la cantante Courtney Love fue llevada a juicio por una diseñadora de moda a la que insultó a través de Twitter y de MySpace. Tras la denuncia, el juez condenó a Love a pagarle en torno a medio millón de dólares por ofenderle delante de más de 40.000 seguidores.


En España, David Bisbal entró en el centro de la polémica por escribir en su cuenta de Twitter un mensaje irónico sobre la situación del turismo en Egipto mientras que el país sacaba adelante una revolución política que acabó con la dictadura en el gobierno. No hubo sanción económica ni causa judicial, pero la imagen del cantante salió perjudicada.


Twitter es un medio de comunicación, y como cualquier otro, la gente puede provocar daños de imagen en la marca y en la reputación 'online' que acaben en enfrentamientos judiciales. Es el mismo mecanismo que se sigue con cualquier blog, radio o periódico.


Espacios no tan privados


Al tratarse de una red social, en la que el usuario adquiere cierta cercanía con sus seguidores y escoge libremente a quien seguir y tiene la opción de bloquear quien le sigue, la sensación de seguridad, de privacidad y de intimidad es mayor que en otros espacios. Sin embargo, la mayoría de los usuarios tienen sus canales abiertos y son públicos, por lo que cualquier insulto o declaración que se realice puede tener consecuencias negativas. Son muchos los casos de trabajadores que han insultado a sus jefes en Twitter o Facebook y que después han sido despedidos o encausados.


Según City News Toronto, este seguro contra 'tweets' polémicos tardará unos cinco años en estar disponible para particulares. Es decir, que los personajes públicos como artistas y deportistas van a seguir siendo responsables de sus comentarios a través de la red de microblogging. Pero no así las marcas, promotores o discográficas que les representan.


lunes, 18 de abril de 2011

El 25% de los niños abre su perfil en las redes sociales

Un 25 % de los menores tiene abierto el acceso a su perfil en las redes sociales a cualquier persona que desee consultarlo, según indica hoy una encuesta elaborada por la Comisión Europea. Además, uno de cada cinco de estos menores con el perfil accesible ha introducido datos como su dirección o su número de teléfono, que, de este modo, son visibles para todo el mundo. Las empresas propietarias de estas redes "deberían hacer inmediatamente que los perfiles de menores fueran accesibles solo para su lista de contactos aprobados", ha señalado en un comunicado la comisaria europea de Agenda Digital, Neelie Kroes.

Kroes considera que las cuentas de menores de edad no deberían poder encontrarse mediante buscadores en línea y urgió a todas las compañías que aún no lo hayan hecho a firmar el código de buenas prácticas para las redes sociales impulsado por la Comisión. "Un creciente número de niños están en las redes sociales pero muchos de ellos no toman las medidas necesarias para protegerse en línea. Estos niños se están exponiendo a que les hagan daño y son vulnerables a acosadores"

Según el estudio, un 38% de los menores europeos entre nueve y doce años está presente en alguna red social, una cifra que aumenta hasta el 77 % para los menores entre trece y dieciséis años. En España, un 28 % de los niños entre nueve y doce años tiene una cuenta en una red social, diez puntos menos que la media europea, aunque para el caso de los adolescentes entre trece y dieciséis el total sube por encima de la media hasta el 81 %. Francia, con un 25 %, y Holanda, con un 70 %, son, respectivamente, los países con un menor y mayor porcentaje de niños entre los nueve y los doce años presentes en las redes sociales.


viernes, 1 de abril de 2011

Inyección de código para Dummies

Este post es un poco más técnico que los anteriores, pero mucho más divertido. ¿Nunca te ha pasado estar jugando al Quake en red y que algunos jugadores siempre te machaquen sin remedio de forma inmisericorde? Probablemente sea porque saben exactamente dónde estás y cuándo doblarás la esquina con tu ridícula escopeta. Estos jugadores inyectan sus propios parches al juego para, por ejemplo, hacer las paredes transparentes y recibir alertas cuando otro jugador les acecha por la retaguardia.

En este post voy a darte una orientación sobre cómo hacer ingeniería inversa de aplicaciones de terceros escritas originalmente en C/C++, de las que sólo tienes en tu poder el ejecutable. Voy a introducirte a las herramientas básicas para indagar en el binario y averiguar su flujo de ejecución, y luego vamos a escribir juntos un simple pache en ansi C para interponer algunas funciones estándar en cualquier aplicación.

Este post tiene fines didácticos, pero espero que al final se te hayan ocurrido aplicaciones mucho más interesantes.

¿Que necesitamos para empezar?

Necesitamos un ordenador con una distribución de Linux y tener instalado el compilador GCC. Pero no te preocupes...

Prometo escribir otro post lo antes posible sobre el mismo tema pero en entornos Mac. Si estás interesado sobre este tema en entorno Windows, te sugiero que te dirijas aquí.

¿Que aplicación vamos a interceptar?

En linux existe una aplicación de consola muy curiosa, llamada fortune, que imprime por pantalla una cita famosa al azar. Vamos a indagar y reemplazar tres funciones de este programita para saber la memoria que reserva y los ficheros que abre. Si no tienes fortune en tu distro, instálalo. Pero tampoco te apures mucho, el parche que vamos a desarrollar es genérico y funcionará en cualquier ejecutable desarrollado en C/C++.

arturo@firecracker $ fortune

Así como los ojos de los murciélagos se ofuscan a la luz del día, de la misma manera a la inteligencia de nuestra alma la ofuscan las cosas evidentes.

-- Aristóteles. (384-322 A.C.) Filósofo griego.

Herramientas útiles

Las siguientes herramientas son muy útiles para hacer ingeniería inversa de un ejecutable. No vamos a utilizarlas todas para nuestro ejemplo pero me gustaría presentártelas para que puedas juguetear con ellas de ahora en adelante. Si tomas el hábito de inspeccionar aplicaciones como quien se fija en chicas por la calle, aprenderás mucho y tu curiosidad crecerá cada vez más.

- strace es una utilidad de línea de comandos que permite monitorizar las llamadas al sistema que realiza un determinado proceso y que encontrarás disponible en cualquier distribución de Linux. Lo normal es arrancarlo junto al programa que queremos inspeccionar. Por ejemplo, para tracear fortune, lo ejecutaríamos de la siguiente manera:


arturo@firecracker$ strace /usr/games/fortune

- strings es una utilidad muy práctica que examina un fichero en busca de cadenas de texto, algo que es mucho más practico de lo que parece. Muy a menudo, cadenas 'secretas', nombres de funciones, constantes o literales importantes se revelarán a sí mismos como un exhibicionista delante de una colegiala. Inspeccionamos fortune de la siguiente manera:

arturo@firecracker$ strings /usr/games/fortune

- nm es una utilidad que imprime por pantalla todos los símbolos encontrados en un binario. Esto incluye nombres de funciones, compartidas o integradas, y en algunos casos las constantes de la aplicación. En este caso, fortune no tiene simbolos, pero otras muchas aplicaciones sí y es muy practico conocer esta herramienta.

- gdb el debuggeador de proyectos de GNU está muy equipado para la ingeniería inversa. Puedes lanzar una aplicación desde GDB y poner puntos de ruptura o incluso examinar estructuras de datos en tiempo de ejecución, pero no es la herramienta más fácil de usar de todas las que tenemos disponibles.

¿Que vamos a hacer?

Si has ejecutado la traza y strings para fortune, habrás visto que hace múltiples llamadas que podemos interceptar, entre ellas las siguientes:

- malloc reserva memoria operativa.

- free libera memoria operativa.

- open abre un fichero.

Pues bien, vamos a programar un módulo en C y a lanzar este mismo proceso con nuestro parche adherido, de forma que podamos imprimir por pantalla qué direcciones de memoria utiliza o liberay con qué ficheros trabaja a lo largo de su ejecución. Para ello, vamos a utilizar una librería de enlazado dinámico de memoria, conocida como dlsym.

¿Qué es dlsym y qué vamos a hacer con él?

El código fuente de un programa debe compilarse para generar un ejecutable y el proceso de compilación lo que hace es asignar a cada una de tus constantes y funciones -entre otras cosas- una dirección de memoria única con la que luego trabaja dentro de un espacio de ejecución delimitado. En un ejecutable, tus constantes y funciones dejan de llamarse como tal y pasan a llamarse símbolos: asociaciones de direcciones de memoria que podemos averiguar y tratar con dlsym.

Con dlsym podemos saber la dirección de memoria de un determinado símbolo, por ejemplo la función malloc(), y también podemos modificar esa dirección de memoria para que llame a nuestra propia versión de la función malloc(), que además, si queremos, puede llamar a la función malloc() original porque hemos almacenado su dirección de memoria previamente. A este proceso se le denomina interposición de funciones, y es lo que vamos a hacer a continuación.

Dicho de forma más coloquial, vamos a secuestrar la llamada de una función original del ejecutable y a espíar que parámetros recibe antes de que se ejecute. Nuestra función hará de puente entre la llamada original y la función que debería procesar esa llamada, reservándonos nosotros el derecho de conocer información que como usuarios no deberíamos saber y a tomar decisiones en función de esa información para alterar la ejecución del programa, normalmente hacia derroteros que harían al arquitecto original tirarse de los pelos.

¿Que aplicaciones tiene esto?

Tiene muchísimas utilidades además de la benévola depuración. Tantas como te puedas imaginar si te mojas un poco. Por ejemplo, si la aplicación destino fuese de mensajería, a lo mejor podríamos espíar los mensajes que están intercambiando dos personas, evitar que cierta persona reciba mensajes o incluso envíar mensajes fraudulentos haciéndonos pasar por alguien sin que ningún inocente usuario sospechase nada (en concreto, interceptar mensajes de texto suele ser muy sencillo porque es costumbre común utilizar la librería de cadenas de C para tratarlas).

Si estuviéramos jugando a un videojuego en red como Quake o Counter Strike, podríamos inyectar un parche que nos permitiese ver a través de las paredes y destrozar a nuestros oponentes. O que lanzase una alarma sonora cuando alguien se nos acerque por la espalda e incluso, para los más imaginativos, podríamos manipular qué mensajes envía nuestro cliente al servidor del juego.

Evidentemente, hay aplicaciones mucho más lucrativas e interesantes, como por ejemplo programar un motor para jugar de forma óptima al póker e inyectárselo a un cliente de juego de póker 'online'. El límite está en la imaginación de cada uno: por regla general, puedes atacar a cualquier aplicación que se ejecute en tu máquina.

Programación e inyección de nuestro parche

1.- Escribimos el código fuente de módulo

A continuación está el código fuente del módulo, es corto y lo único que hace es interponerse entre las funciones malloc(), free() y open(). De forma que abre tu editor de código favorito y escribe o pega el siguiente código. Como verás, para interponer una función tan solo debemos conocer su prototipo. Y recuerda que los programadores que no utilizan Vim van al infierno.

Esta funcionalidad se puede implementar de muchas maneras, pero la más sencilla es la siguiente.

Fichero: pi.c

#define _GNU_SOURCE
#include stdint.h
#include stdio.h
#include stdarg.h
#include dlfcn.h

/**
* Interponemos nuestra funcion open
*
* @param char* filename
* @param int flags
*/
int open(char* filename, int flags)
{
// Cojo la direccion de memoria de la funcion original y le asigno un nombre
static int (*real_open)(char*, int) = NULL;
if (!real_open)
real_open = dlsym(RTLD_NEXT, "open");

// Ejecuto el original, imprimo resultado por pantalla y devuelvo el resultado
int p = real_open(filename, flags);
fprintf(stderr, "Abrimos %s) = %i\n", filename, flags);
return p;
}

/**
* Interponemos nuestra funcion malloc
*
* @param size_t size
*/
void* malloc(size_t size)
{
// Cojo la direccion de memoria de la funcion original y le asigno un nombre
static void* (*real_malloc)(size_t) = NULL;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");

// Ejecuto el original, imprimo resultado por pantalla y devuelvo el resultado
void *p = real_malloc(size);
fprintf(stderr, "Reserva de memoria (%d) = %p\n", size, p);
return p;
}

/**
* Interponemos nuestra funcion free
*
* @param size_t size
*/
void* free(void* ptr)
{
// Cojo la direccion de memoria de la funcion original y le asigno un nombre
static void* (*real_free)(void*) = NULL;
if (!real_free)
real_free = dlsym(RTLD_NEXT, "free");

// Ejecuto el original, imprimo resultado por pantalla y devuelvo el resultado
int *p = real_free(ptr);
fprintf(stderr, "Libero memoria (%p)\n", ptr);
return p;
}

2.- Compilamos el modulo

Compilamos el módulo con la siguiente instrucción. Verás que escupe un 'warning' porque reescribimos el nombre de una función estándar, pero eso no nos importa.

arturo@firecracker $ gcc -Wall -O2 -fpic -shared -ldl -o pi.so pi.c

Si todo ha ido bien, la compilación nos ha creado un objeto compartido llamado pi.so que vamos a inyectar a un programa a continuación.

3. Ejecución de una aplicación con nuestro parche

En entornos Linux, la directiva LD_PRELOAD permite lanzar un proceso obligando al sistema operativo a cargar un objeto compartido antes de la ejecución. Esto nos permite adherir nuestro parche a cualquier aplicación que queramos interceptar. Hay que tener cuidado y facilitar la ruta completa del objeto compartido, de lo contrario no funcionará. A continuación ejecuto nuestro ejemplo y de paso echamos un ojo a la salida que produce.

Verás que la salida en realidad es mucho más larga, he seleccionado solo el último segmento de la salida, que tiene todos los elementos que hemos interceptado.

arturo@firecracker $ LD_PRELOAD=/home/arturo/pi.so /usr/games/fortune
Reserva de memoria (39) = 0x8911c70
Libero memoria (0x8911c70)
Reserva de memoria (392) = 0x8911d48
Reserva de memoria (11) = 0x8911ed8
Reserva de memoria (11) = 0x8911ee8
Reserva de memoria (11) = 0x8911ef8
Libero memoria ((nil))
Reserva de memoria (19) = 0x8911f08
Reserva de memoria (19) = 0x8911f20
Reserva de memoria (6) = 0x8911f38
Libero memoria (0x8911f38)
Reserva de memoria (12) = 0x8911f38
Libero memoria (0x8911f38)
Reserva de memoria (2248) = 0x8911f38
Libero memoria (0x8911f38)
Libero memoria (0x8911f20)
Libero memoria (0x8911f08)
Abrimos /usr/share/games/fortunes/familia.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/proverbios.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/varios.fortunes-pre.dat) = 0
Abrimos /usr/share/games/fortunes/famosos.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/vida.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/refranes.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/sabiduria.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/informatica.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/humanos.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/asimov.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/leydemurphy.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/lao-tse.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/ciencia.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/poder.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/nietzsche.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/varios.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/amistad.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/arte.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/deprimente.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/sentimientos.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/pintadas.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/verdad.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/filosofia.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/libertad.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/schopenhauer.fortunes.dat) = 0
Abrimos /usr/share/games/fortunes/refranes.fortunes.dat) = 0
Reserva de memoria (352) = 0x8911f38
Reserva de memoria (52) = 0x8911d10
Reserva de memoria (44) = 0x8911c70
Reserva de memoria (44) = 0x89120a0
Libero memoria (0x8911c70)
Libero memoria (0x89120a0)
Libero memoria (0x8911d10)
Cuando el español canta, o tiene mala leche o poco le falta.
Libero memoria (0x89120d0)
Libero memoria (0x8912808)
Libero memoria (0x890e8f8)

Como verás, la ejecución normal va acompañada de nuestros mensajes de traza que nos indican todo lo que queremos saber:

Qué direcciones de memoria reserva y en qué orden. Qué direcciones de memoria libera y en qué orden. Qué ficheros abre a lo largo de la ejecución del proceso.

Sólo hemos interceptado esas tres funciones, pero podríamos haber interceptado varios cientos con la misma facilidad. Tan sólo necesitamos saber el prototipo o cabecera de la función para poder escribir nuestra propia versión y que la llamada sea transparente. Para más información sobre funciones estándar, te recomiendo que visites la referencia de C++.

Enlaces de interés:

- Inyección de código en la Wikipedia

- Documentación de Dlsym

- Como construí un bot de poker - Muy inspiracional

- Hacks de Counter StrikeReferencia C++ - Todas las funciones compartidas son interceptables facilmente


http://www.elmundo.es/blogs/elmundo/totalsiessoloapretarunboton/2011/04/01/inyeccion-de-codigo-para-dummies.html