Ataque de desbordamiento de búfer con ejemplo

Un búfer es un área temporal para el almacenamiento de datos. Cuando un programa o proceso del sistema coloca más datos (de los que se asignaron originalmente para almacenar), los datos adicionales se desbordan. Hace que algunos de esos datos se filtren a otros búferes, lo que puede corromper o sobrescribir los datos que tenían.
En un ataque de desbordamiento de búfer, los datos adicionales a veces contienen instrucciones específicas para acciones previstas por un pirata informático o un usuario malintencionado; por ejemplo, los datos podrían desenstringr una respuesta que dañe archivos, cambie datos o revele información privada.
El atacante usaría un exploit de desbordamiento de búfer para aprovechar un programa que está esperando la entrada de un usuario. Hay dos tipos de desbordamientos de búfer: basados ​​en pila y basados ​​en montón. Los basados ​​en montón, que son difíciles de ejecutar y los menos comunes de los dos, atacan una aplicación inundando el espacio de memoria reservado para un programa. Los desbordamientos de búfer basados ​​en pilas, que son más comunes entre los atacantes, aprovechan las aplicaciones y los programas utilizando lo que se conoce como un espacio de memoria de pila que se usa para almacenar la entrada del usuario.
Estudiemos algunos ejemplos de programas reales que muestran el peligro de tales situaciones basadas en el C. 
En los ejemplos, no implementamos ninguna inyección de código malicioso, solo para mostrar que el búfer puede desbordarse. Los compiladores modernos normalmente brindan la opción de verificación de desbordamiento durante el tiempo de compilación/enlace, pero durante el tiempo de ejecución es bastante difícil verificar este problema sin ningún mecanismo de protección adicional, como el uso del manejo de excepciones.
 

C

// A C program to demonstrate buffer overflow
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
 
       // Reserve 5 byte of buffer plus the terminating NULL.
       // should allocate 8 bytes = 2 double words,
       // To overflow, need more than 8 bytes...
       char buffer[5];  // If more than 8 characters input
                        // by user, there will be access
                        // violation, segmentation fault
 
       // a prompt how to execute the program...
       if (argc < 2)
       {
              printf("strcpy() NOT executed....\n");
              printf("Syntax: %s <characters>\n", argv[0]);
              exit(0);
       }
 
       // copy the user input to mybuffer, without any
       // bound checking a secure version is strcpy_s()
       strcpy(buffer, argv[1]);
       printf("buffer content= %s\n", buffer);
 
       // you may want to try strcpy_s()
       printf("strcpy() executed...\n");
 
       return 0;
}

Compile este programa en Linux y para la salida use el comando archivo_salida INPUT 
 

 Input  : 12345678 (8 bytes), the program run smoothly.
 Input : 123456789 (9 bytes)
"Segmentation fault" message will be displayed and the program terminates.

La vulnerabilidad existe porque el búfer podría desbordarse si el usuario ingresa (argv[1]) más de 8 bytes. ¿Por qué 8 bytes? Para un sistema de 32 bits (4 bytes), debemos llenar una memoria de doble palabra (32 bits). El tamaño del carácter (char) es de 1 byte, por lo que si solicitamos un búfer con 5 bytes, el sistema asignará 2 palabras dobles (8 bytes). Es por eso que cuando ingresa más de 8 bytes; mybuffer se desbordará
Funciones estándar similares que son técnicamente menos vulnerables, como strncpy(), strncat() y memcpy(), existen. Pero el problema con estas funciones es que es responsabilidad del programador determinar el tamaño del búfer, no el compilador.
Todo codificador o programador de C/C++ debe conocer el problema del desbordamiento del búfer antes de realizar la codificación. Una gran cantidad de errores generados, en la mayoría de los casos, pueden explotarse como resultado de un desbordamiento del búfer.
REFERENCIAS  
Wikipedia  
BufferOverflow  
c++BufferOverflow
Este artículo es una contribución de Akash Sharan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *