Iniciarse en seguridad informática no suele ser sencillo, pero menos sencillo es trabajar con binarios. Para ello necesitamos entender primero qué es un binario, y cómo funciona. Una vez conozcamos lo básico podemos trabajar con ello.
¿Qué es un binario?
Un binario se puede ver como un conjunto de instrucciones. Además de instrucciones suele tener una zona para almacenar toda la información necesaria para su ejecución.
Parte de las instrucciones puede estar en librería externas que suelen estar enlazadas. Este enlace se puede hacer de forma estática o de forma dinámica.
Con toda esta información nuestro binario podría comenzar la ejecución, pero existe un problema en función del sistema operativo. Para poder ejecutar un binario tenemos que entender en que ‘idioma’ está. Existen varios idiomas en función de la arquitectura. Esto se puede ver al lanzar el comando file.
En el ejemplo se puede ver claro, es un binario en formato ELF de 32 bit. También está enlazado de forma dinámica. Por último, tiene toda la información para simplificar en análisis con el “not stripped”. Esto se suele ver en algunos binarios, pero no siempre estará disponible esta ayuda para el análisis.
Pero faltaría un dato importante, ¿qué significa LSB? Esta pregunta es relevante, impacta en cómo guarda la información. Hay dos opciones disponibles LSB y MSB. LSB nos indica que el bit menos importante es el primero, y MSB que el primer bit es el más importante. Es decir, LSB interpreta el número de derecha a izquierda y MSB de izquierda a derecha.
Por otra parte tenemos el endianness. Que tiene que ver con la ordenación de los bit, normalmente si en un binario vemos LSB o MSB se refiere a cómo almacena los valores y direcciones, algo importante para los posteriores puntos de entrada. Si tenemos LSB el orden es el normal, pero si el binario es MSB los valores irán cambiamos. Por ejemplo el entero de 16 bits 0x1122 en LSB será 0x11 0x22, pero en MSB será 0x22 0x11.
¿Cómo funciona un binario?
El binario ejecuta el código partiendo de la primera instrucción, y finalizará cuando no tenga más código que ejecutar. Pero tendrá que consultar los librería externas. Para esta función tenemos el “linker” que realizará este trabajo.
Con todo preparado, nuestro sistema comenzará la operación y tendremos que tener en cuenta varias partes. Lo primero es por qué instrucción va el programa. Lo siguiente es la pila o stack y el montículo o heap. En la pila irémos almacenando de forma general los parámetros, variables y dirección de retorno de cada llamada. En el montículo almacenaremos variables y reservas dinámicas de problemas. Tengamos en cuenta que la pila crece hacía el montículo, y el montículo crece hacía la pila.
Por último, hay que saber qué opciones tenemos de explotación del binario, para ello hay un comando llamado checksec. Nos informará si el stack tiene algún tipo de protección, o si tiene direcciones de instrucciones fijas o dinámicas.
Casos básico de un binario
Ahora que tenemos todos los conocimientos básicos para comenzar. Normalmente los los binarios suelen venir en C ya que es manipulable.
Los errores básicos vienen de las funciones printf o gets.
Printf
Si hay un printf y tenemos la capacidad de poder modificar el string de formato, es decir, el primer parámetro podemos filtrar información. Todo este problema está documentado por OWASP con ejemplos y cómo protegerse.
Gets
El comando get lee por la entrada estandar toda la información disponible, y esto hace que no respete los límites de las variables, pudiendo modificar los valores de la pila o montículo creando un desbordamiento. Al igual que el problema anterior, está perfectamente documentado por OWASP.
Conclusión
Con toda esta información toca comenzar a probar. En otro artículo ya comentamos diferentes plataformas. Pero con todo lo visto en este artículo lo mejor es revisar en profundidad cada elemento desconocido.
Pero qué mejor que aprender de otras personas. Se puede empezar con Nightmare, una guía tutorial con ejemplos para aprender. Y siempre está la opción de buscar writeups o los retos básicos de picoCTF.
Las imágenes se han obtenido de Wikimedia.org.