# Buffer Overflow

El desbordamiento de buffer es una vulnerabilidad de seguridad que ocurre cuando un programa escribe más datos en un buffer de los que este puede manejar. Esto puede llevar a la corrupción de datos adyacentes en la memoria, y en algunos casos, puede ser explotado para ejecutar código arbitrario.

## <mark style="color:green;">**El Stack (Pila)**</mark>

El stack es una estructura de datos en memoria utilizada para almacenar variables locales y para mantener el control de la ejecución de funciones en un programa. Es una zona de memoria que crece y decrece dinámicamente conforme se realizan llamadas a funciones y se retornan de ellas.

### <mark style="color:green;">**Componentes del Stack:**</mark>

* <mark style="color:green;">**Frame Pointer (FP) o Base Pointer (BP):**</mark> Un registro que apunta al comienzo del stack frame actual.
* <mark style="color:green;">**Stack Pointer (SP):**</mark> Un registro que apunta al tope del stack.
* <mark style="color:green;">**Return Address:**</mark> Dirección a la que se debe retornar después de ejecutar una función.
* <mark style="color:green;">**Variables Locales:**</mark> Almacenadas en el stack para su uso dentro de la función.

### <mark style="color:green;">**Funcionamiento del Stack**</mark>

Cuando se llama a una función, se crea un nuevo stack frame:

1. <mark style="color:green;">**Push Return Address:**</mark> La dirección de retorno es empujada al stack.
2. <mark style="color:green;">**Push Frame Pointer:**</mark> El valor actual del frame pointer es empujado al stack.
3. <mark style="color:green;">**Update Frame Pointer:**</mark> El frame pointer se actualiza para apuntar al nuevo stack frame.
4. <mark style="color:green;">**Allocate Space for Local Variables:**</mark> Se reserva espacio en el stack para las variables locales de la función.

Cuando la función termina, el stack frame se destruye y se retorna a la dirección almacenada en el return address.

## <mark style="color:green;">Buffer Overflow</mark>

Un desbordamiento de buffer ocurre cuando se escriben más datos de los que un buffer puede manejar, sobreescribiendo así memoria adyacente. Esto puede ocurrir debido a una falta de validación de límites de entrada.

Si un atacante puede controlar la entrada que causa el desbordamiento, puede sobrescribir el return address en el stack. De este modo, cuando la función termina, en lugar de retornar a la dirección original, el flujo de ejecución salta a una dirección controlada por el atacante, permitiendo la ejecución de código arbitrario.

## <mark style="color:green;">Diferencias entre Windows y Linux</mark>

### <mark style="color:green;">**Gestión de Memoria**</mark>

* <mark style="color:green;">**Windows:**</mark> Utiliza SEH (Structured Exception Handling) y DEP (Data Execution Prevention) para proteger contra exploits de buffer overflow. ASLR (Address Space Layout Randomization) también se utiliza para aleatorizar la disposición de los segmentos de memoria.
* <mark style="color:green;">**Linux:**</mark> Utiliza mecanismos similares como NX (No-eXecute) bit y ASLR. Sin embargo, la implementación y los detalles pueden diferir.

### <mark style="color:green;">**Protección del Stack**</mark>

* **Windows:** Utiliza canaries (valores aleatorios) para proteger el stack. Si el canary es modificado, el programa detecta el desbordamiento y aborta.
* **Linux:** Similar a Windows, también utiliza canaries y otros mecanismos de protección como Stack Smashing Protector (SSP).

## <mark style="color:green;">Explotación Binaria a Bajo Nivel</mark>

### <mark style="color:green;">**Registros y Direcciones**</mark>

Los registros son pequeñas áreas de almacenamiento en la CPU que son extremadamente rápidas. Algunos registros importantes son:

* <mark style="color:green;">**EIP/RIP (Instruction Pointer):**</mark> Apunta a la próxima instrucción a ejecutar.
* <mark style="color:green;">**ESP/RSP (Stack Pointer):**</mark> Apunta al tope del stack.
* <mark style="color:green;">**EBP/RBP (Base Pointer):**</mark> Apunta al inicio del stack frame actual.

### <mark style="color:green;">**Manipulación del Stack**</mark>

En un ataque de buffer overflow, el objetivo es sobrescribir el EIP/RIP para redirigir el flujo de ejecución. Esto se logra sobreescribiendo el return address en el stack frame.

## <mark style="color:green;">**Shellcode**</mark>

El shellcode es una pequeña pieza de código que se inyecta en el stack y se ejecuta al tomar control del flujo de ejecución. Está diseñado para realizar tareas específicas, como abrir una shell o conectarse a un servidor remoto.

## <mark style="color:green;">Ejemplo de Buffer Overflow</mark> <mark style="color:green;"></mark><mark style="color:green;">**Código Vulnerable en C:**</mark>

Si el atacante provee una entrada mayor a 64 bytes, puede sobrescribir la memoria adyacente y potencialmente controlar el EIP/RIP.

```c
#include <stdio.h>
#include <string.h>

void vulnerable_function(char *input) {
    char buffer[64];
    strcpy(buffer, input); // No hay verificación de límites
}

int main(int argc, char *argv[]) {
    if (argc > 1) {
        vulnerable_function(argv[1]);
    }
    return 0;
}
```

## <mark style="color:green;">**Técnicas de Mitigación**</mark>

* <mark style="color:green;">**Canaries:**</mark> Valores aleatorios colocados antes del return address. Si se alteran, se detecta el desbordamiento.
* <mark style="color:green;">**ASLR:**</mark> Aleatoriza las direcciones de memoria para dificultar la predicción de direcciones útiles para el atacante.
* <mark style="color:green;">**DEP/NX:**</mark> Previene la ejecución de código en ciertas áreas de memoria.
* <mark style="color:green;">**Fortificación de Código:**</mark> Usar funciones seguras que verifican los límites, como `strncpy` en lugar de `strcpy`.

## <mark style="color:green;">Conclusión</mark>

El desbordamiento de buffer es una vulnerabilidad crítica que ha sido explotada extensamente en el pasado. Con un entendimiento profundo del stack y la gestión de memoria, los atacantes pueden desarrollar exploits sofisticados. Sin embargo, con las técnicas de mitigación modernas y las buenas prácticas de programación, se pueden prevenir muchos de estos ataques.
