La Red de Conocimientos Pedagógicos - Conocimientos históricos - Qué es el desbordamiento_Análisis de las causas del desbordamiento

Qué es el desbordamiento_Análisis de las causas del desbordamiento

Un hacker puede desbordar la variable para que la dirección del remitente apunte al código de ataque y obtenga el control del administrador sobre su computadora. Entonces, ¿cuánto sabes sobre el desbordamiento? El siguiente es el contenido que compilé sobre qué es el desbordamiento. Espero que te guste

¿Qué es el desbordamiento?

¡El desbordamiento es una vulnerabilidad que atacan los piratas informáticos! exploit en el sistema operativo. Ha desarrollado un programa especialmente después de agregar los parámetros correspondientes y ejecutarlo, puede obtener control sobre su computadora con calificaciones de administrador. Puede hacer todas las cosas que puede ejecutar en su propia computadora. su computadora le pertenece (también llamada parrilla, también llamada máquina de marionetas).

El desbordamiento es un error causado por deficiencias de diseño del programador. Clasificación del desbordamiento

Desbordamiento de búfer

El búfer es una memoria continua asignada por el usuario en la computadora cuando el programa se está ejecutando. Almacena datos de un tipo determinado. El desbordamiento del búfer se refiere a un método de ataque al sistema común y muy dañino. Al escribir contenido que excede la longitud del búfer del programa, provoca que el búfer se desborde, destruyendo así la pila del programa y provocando que el programa ejecute otras tareas para lograr el objetivo. propósito del ataque. Lo que es más grave es que los ataques de desbordamiento de búfer representan la gran mayoría de los ataques a redes remotas. Este tipo de ataque puede brindarle a un usuario anónimo de Internet la oportunidad de obtener el control parcial o total de un host. ¡Porque este tipo de ataque permite cualquier cosa! para cualquiera obtener el control de un host, por lo que representa una amenaza de seguridad extremadamente grave.

El propósito de un ataque de desbordamiento de búfer es interrumpir la funcionalidad de un programa que se ejecuta con ciertos privilegios, de modo que el atacante pueda obtener el control del programa. Si el programa tiene permisos suficientes, todo el host estará disponible. controlado. En términos generales, el atacante ataca el programa raíz y luego ejecuta un código de ejecución similar a exec(sh) para obtener el shell raíz. Para lograr este objetivo, el atacante debe lograr los dos objetivos siguientes: organizar el código apropiado en el espacio de direcciones del programa y permitir que el programa salte al espacio de direcciones preestablecido para su ejecución inicializando adecuadamente los registros y la memoria. Según estos dos objetivos, los ataques de desbordamiento de búfer se pueden dividir en las tres categorías siguientes.

Clasificación de desbordamiento de búfer

Transferencia del programa de control al código de ataque

Este método se refiere a cambiar el flujo de ejecución del programa para que salte al código de ataque . El método más básico es desbordar un búfer sin verificación de límites u otras debilidades, interrumpiendo así el orden de ejecución normal del programa. Al desbordar un búfer, un atacante puede utilizar un método casi de fuerza bruta para sobrescribir el espacio del programa adyacente y omitir directamente las comprobaciones del sistema.

1.2.1 Registros de activación

Cada vez que se produce una llamada a una función, la persona que llama dejará un registro de activación en la pila, que contiene la información devuelta cuando finaliza la dirección de la función. El atacante desborda estas variables automáticas para que la dirección del remitente apunte al código de ataque. Al cambiar la dirección de retorno del programa, cuando finaliza la llamada a la función, el programa salta a la dirección establecida por el atacante en lugar de la dirección original. Este tipo de desbordamiento de búfer se denomina "ataque de destrucción de pila" y es un método de ataque de desbordamiento de búfer de uso común.

1.2.2 Punteros de función

En lenguaje C, ?void (* foo())? declara una variable foo cuyo valor de retorno es un puntero de función nulo. Los punteros de función se pueden usar para ubicar cualquier espacio de direcciones, por lo que un atacante solo necesita encontrar un búfer desbordable cerca del puntero de función en cualquier espacio y luego desbordar este búfer para cambiar el puntero de función. En un momento determinado, cuando el programa llama a una función a través de un puntero de función, el flujo del programa se realiza de acuerdo con la intención del atacante. ¡Uno de sus ejemplos de ataque es el programa súper sonda en el sistema Linux!

1.2.3 Búfers Longjmp

El lenguaje C contiene un sistema simple de verificación/recuperación llamado setjmp/longjmp.

Esto significa configurar ?setjmp(buffer)? en el punto de control y usar ?longjmp(buffer)? Sin embargo, si un atacante puede acceder al espacio del búfer, entonces longjmp(buffer) salta al código del atacante. Al igual que los punteros de función, los buffers longjmp pueden apuntar a cualquier lugar, por lo que todo lo que un atacante tiene que hacer es encontrar un buffer para desbordarse. Un ejemplo típico es Perl 5.003. El atacante primero ingresa al búfer longjmp utilizado para recuperar desbordamientos del búfer y luego lo induce a ingresar al modo de recuperación, lo que hace que el intérprete de Perl salte al código de ataque.

¡El más simple! Y el tipo más común de ataque de desbordamiento de búfer es combinar colonización de código y registros de activación en una cadena. El atacante localiza una variable automática que puede desbordarse y luego pasa una cadena grande al programa, lo que provoca un desbordamiento del búfer para cambiar el registro de activación e insertar código al mismo tiempo. Éste es un modelo para el ataque señalado por Levy. Debido a que el lenguaje C tradicionalmente solo abre un pequeño búfer para usuarios y parámetros, existen muchos casos de este tipo de ataque de vulnerabilidad.

La colonización de código y el desbordamiento del búfer no tienen por qué completarse en una sola acción. Un atacante puede colocar código dentro de un búfer que no puede desbordar el búfer. Luego, el atacante transfiere el puntero del programa desbordando otro búfer. Este método se utiliza generalmente para resolver la situación en la que el búfer de desbordamiento no es lo suficientemente grande.

Si un atacante intenta utilizar un código ya residente en lugar de colonizar el código desde fuera, normalmente tiene que parametrizar el código. Por ejemplo, algunos segmentos de código en libc ejecutarán ?exec(algo)?, donde algo es el parámetro. Luego, el atacante utilizó un desbordamiento del búfer para cambiar los parámetros del programa y otro desbordamiento del búfer para apuntar el puntero del programa a una sección específica de código en libc.

Desbordamiento de memoria

El desbordamiento de memoria ha sido un problema "viejo y difícil" en la historia del desarrollo de software durante casi 40 años. Como se muestra en el incidente del virus "Code Red", Se ha convertido en el principal culpable de que los piratas informáticos ataquen las redes corporativas.

Si los datos ingresados ​​en un campo exceden sus requisitos, causará un problema de desbordamiento de datos y los datos sobrantes pueden usarse como instrucciones para ejecutar en la computadora. Según grupos de seguridad relevantes, más del 50% de las vulnerabilidades de seguridad en los sistemas operativos son causadas por desbordamientos de memoria y la mayoría de ellas están relacionadas con la tecnología de Microsoft.

El software de Microsoft está desarrollado para computadoras de escritorio y el desbordamiento de la memoria no causará problemas graves. Sin embargo, las computadoras de escritorio existentes generalmente están conectadas a Internet y el desbordamiento de la memoria proporciona condiciones convenientes para que los piratas informáticos las invadan.

Desbordamiento de datos

En las computadoras, cuando los datos a representar exceden el rango de representación de los datos utilizados por la computadora, se produce un desbordamiento de datos. Analizando las causas del desbordamiento

Realidad

En casi todos los lenguajes informáticos, ya sean nuevos o antiguos, cualquier intento de desbordar un búfer normalmente será bloqueado automáticamente por el propio lenguaje. Detectarlo y prevenirlo. (por ejemplo, generando una excepción o agregando más espacio al búfer según sea necesario). Pero hay dos lenguajes en los que esto no es así: los lenguajes C y C++. Los lenguajes C y C++ a menudo simplemente permiten que se escriban datos adicionales en todas partes del resto de la memoria, y esto puede explotarse con resultados horribles. Peor aún, escribir código correcto para manejar los desbordamientos del búfer de manera consistente en C y C++ es aún más difícil; es fácil provocar accidentalmente un desbordamiento del búfer; Probablemente estos sean hechos irrelevantes excepto que C y C++ se usan ampliamente; por ejemplo, el 86% de las líneas de código en Red Hat Linux 7.1 están escritas en C o C++; Por lo tanto, una gran cantidad de código es vulnerable a este problema porque el lenguaje de implementación no puede proteger el código de este problema.

Razones objetivas

En los propios lenguajes C y C++, este problema no es fácil de resolver. La pregunta se basa en decisiones de diseño fundamentales del lenguaje C (específicamente la forma en que se manejan los punteros y las matrices en C).

Dado que C++ es el superconjunto más compatible del lenguaje C, tiene el mismo problema. Hay algunas versiones compatibles con C/C++ que evitan este problema, pero sufren problemas de rendimiento extremadamente graves. Y una vez que cambia C para evitar este problema, ya no es C. Muchos lenguajes (como Java y C#) son sintácticamente similares a C, pero en realidad son lenguajes diferentes, y cambiar un programa C o C++ existente para usar esos lenguajes es una tarea difícil.

Factores comunes