miércoles, 31 de octubre de 2012

Esteganografía

    La esteganografía es la parte de la criptología en la que se estudian y aplican técnicas que permiten el ocultamiento de mensajes u objetos, dentro de otros, llamados portadores, de modo que no se perciba su existencia.
   En esta entrada veremos un ejemplo de como utilizando como portador una fotografía cualquiera podremos ocultar un mensaje entre los pixels que la forman.
    
   En primer lugar cargamos el archivo .bmp. Cada pixel está formado por 3 bytes que representan el tono de rojo, azul y verde.
   Pequeñas diferencias (<10) son apenas perceptibles a nuestros ojos, asique eliminando las unidades hacemos sitio para ocultar aí nuestro mensaje. Leemos cada pixel y sumamos a su valor con las unidades ya truncadas  el byte correspondiente del mensaje, permitiendo así ocultar mensajes de tamaño alto x ancho de la fotografía.
   A la hora de decodificar leeremos la foto modificada y componemos el mensaje original con las unidades de cada color de cada pixel. 
   Se podría mejorar la seguridad del mensaje ocultado encriptándolo con algún algoritmo de cifrado, para que no cualqueira que poseyese el programa pueda leer el mensaje.
.
Imagen original.

Imagen con el código fuente del programa incrustado.

   Como podemos observar, apenas hay perdida de calidad ni se detectan artefactos en la imagen.

   Aqui os dejo el código del programa que hemos creado.

miércoles, 10 de octubre de 2012

Buffer overflow


Un Buffer Overflow es un error de programación que tiene lugar al copiar una cantidad de datos sobre un área que no es lo suficientemente grande como para contener dichos datos, produciendose así la sobreescritura de zonas de memoria.
Aqui vemos un programa vulnerable a un ataque por buffer overflow:


#include <stdio.h>
int vulnerable()
{
    char buf[100]
    printf("Introduce tu nombre:");
    fflush(stdout);
    gets(buf);
    printf("Hola \"%s\"\n", buf);
}
int main(int argc, char** argv)
{
    vulnerable();
}


En este caso si le diesemos una entrada a este programa más larga que la capacidad de "buf" estaríamos escribiendo directamente en la memoria, pudiendo introducir codigo que el sistema ejecutaría al no devolver el control al programa atacado, como por ejemplo:

\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh

Este código pretende ejecutar /bin/sh y por tanto devolvernos una terminal que podríamos usar.