[FADB] 0. Introducción

FUNDAMENTOS DE LOS ATAQUES POR DESBORDAMIENTO DE BUFFER

Para entender esta serie hace falta un conocimiento del lenguaje C y ensamblador. No hace falta ser un experto ni mucho menos, los artículos están muy detallados. Para cualquier duda, simplemente ¡comentad!


Un desbordamiento de buffer ocurre cuando escribimos en un buffer una cantidad de datos mayor de la que es capaz de almacenar dicho buffer. Cuando esto ocurre, la memoria que se encuentra después del final del buffer se sobreescribe con los datos que no caben en éste.

Dado que para entender de qué trata y cómo funciona un desbordamiento de buffer hay que referirse a niveles muy bajos de programación (ensamblador) que implican diferencias entre arquitecturas y sistemas operativos, he decidido centrarme en Linux (gcc 3.2 y gdb 5.2.1-2mdk) corriendo sobre Intel 386 (o superior pero 32 bits: 486, Pentium, Celeron, AMD...). Esta decisión está basada en que la arquitectura IA-32 es la más ampliamente disponible y que cualquier distribución de Linux (disponibles casi todas gratuitamente y descargables de Internet) tiene incorporadas todas las herramientas que vamos a necesitar, a parte de la inherente robustez de este sistema operativo para realizar tareas de programación.

Empezaré haciendo un repaso de algunas características de la arquitectura de IA-32 de Intel: funcionamiento de la pila con las instrucciones PUSH y POP, las llamadas a procedimientos con las instrucciones CALL y RET, el paso de parámetros por pila y las variables locales en la pila.

Una vez aclarados estos puntos, pasaremos a las técnicas que permiten explotar un desbordamiento de buffer: primero, abordaremos la sobreescritura directa de la dirección de retorno de un procedimiento; después con un desbordamiento de buffer en vez de directamente. Llegados a este punto introduciremos la llamada al sistema execve() que nos permite sustituir el proceso actual por otro. Segundo, ejecutaremos una cadena de caracteres (string en C) como si fuera código, directamente y con desbordamiento de buffer. Tercero, veremos un ejemplo de cómo conseguir hacer lo que hemos visto con un programa que tan sólo recibe una entrada de texto.

Comments

Popular Posts