He leído un libro acerca de desbordamiento de búfer, y se sugiere el siguiente lidiar con

Hacer la pila (y pilas) no ejecutable proporciona un alto grado de
protección contra muchos tipos de ataques de desbordamiento de búfer existente
programas.

Pero no entiendo cómo podemos hacerlo – cuando la ejecución tendría lugar, si no en el montón o en la pila?

InformationsquelleAutor Adam Sh | 2012-07-14

7 Comentarios

  1. 23

    Si entiendo tu pregunta correctamente, ninguna de las otras respuestas de la dirección. La respuesta es que la ejecución se produce en la sección de código, que no es ni pila ni montón. En un típico paginado de memoria del sistema, el código de un archivo de programa (por ejemplo, un .exe en Windows) es cargado en el ejecutable, sino sólo-lectura de las páginas. Adicionales de escritura (y ejecutable) páginas son asignados para el proceso de la pila y el montón. La sugerencia aquí es que el sistema operativo y el hardware debe cooperar para marcar las páginas de escritura, pero no ejecutable (rgngl la respuesta explica cómo hacerlo en Windows).

    Incluso con los no-ejecutable montón y de la pila, los ataques están siendo posible que el uso de la devolución de la programación orientada mencionados en el Alexey Frunze la respuesta, pero hay técnicas de protección que impiden incluso aquellos que, como la pila de smashing protección y diseño del espacio de direcciones de la aleatorización-ver http://en.wikipedia.org/wiki/Return-to-libc_attack#Protection_from_return-to-libc_attacks

  2. 10

    Hay lo que se llama «el retorno de la programación orientada a» (AKA ROP) tipo de hazañas.

    El atacante encuentra cómo hacer que su mal código de diferentes piezas de que el programa que está siendo explotado.

    Encuentra utilizable secuencias de bytes (instrucciones) antes de la venida de instrucción byte(s) que puede hacer útiles las operaciones sobre los registros o la memoria como mover un valor a una ubicación, agregar los valores, los valores de comparación, etc, etc. Esos son micro subrutinas que el exploit se construye de.

    A continuación, mediante la explotación de un error de código que el atacante se obliga a que el programa para iniciar la ejecución de la cadena de las micro subrutinas que hace todo el mal trabajo.

    Así, ahora bien el código se convierte en el mal código. Nada de lo ejecutado en la pila o en el montón.

    También es de destacar que en las Cpu cuando las instrucciones abarcan varios bytes y son de longitud variable, incluso la inmediata instrucción operandos (IOW, constantes numéricas) que son parte de las instrucciones puede convertirse en código, y por tanto, las posibilidades de encontrar utilizable secuencias de bytes son más altos de los que hay en «simple» Cpu.

    Es también a menudo posible construir un código malicioso que va a cambiar de protección de memoria y el exploit ya no estará limitado por el código de la aplicación existente.

  3. 4

    Ejemplo concreto: los Arreglos para el retorno de la dirección a system y la ranura al lado de la pila (o el primer argumento que se registra en pasar-por-registro de arcos) a ser un puntero a la cadena "/bin/sh".

    • Pero no se necesita tener acceso a la consola en este caso?
    • No. Yo estaba asumiendo que el proceso de entrada es un socket o terminal que está conectado, pero si no, basta con cambiar "/bin/sh" a "/bin/sh 0<&n" donde n es el descriptor de archivo número del servidor de socket para su conexión.
    • O, por supuesto, usted puede cambiarlo para hacer lo que quiera sin un shell interactivo, por ejemplo, "echo 'toor::0:0::/:/bin/sh' >> /etc/passwd"
  4. 1

    De este tipo de protección es proporcionada por el sistema operativo y no se puede hacer en la capa de aplicación.

    Ver el artículo de la wikipedia, que dice también cómo activarlo en Windows: http://en.wikipedia.org/wiki/Data_Execution_Prevention

    • En teoría, usted puede hacerlo usted mismo, es esencialmente sólo un montón de llamadas a mprotect(2).
    • Gracias por la info 🙂
    • No hay problema 🙂 Solo recuerda que es la cosa más importante a hacer es asegurarse de que la memoria no es tanto escribir y ejecutar al mismo tiempo.
  5. 0

    puede saltar a cualquier otro lugar que es ejecutable segmento y ejecutar su mal código…

    Después de todo, Todos los datos de almacenamiento, la memoria es bits y bits pueden ser instrucciones a la cpu para ejecutar.

    • La cuestión parece ser el caso, cuando todo excepto el código del programa está en la memoria no ejecutables. ¿Cómo se carga el código en la memoria ejecutable, entonces? Saltar a que puede ser fácil.
    • el atacante puede utilizar el código de ejemplo buscar pop eax; jmp eax …
  6. 0

    Usted puede utilizar su desbordamiento para sobrescribir la dirección de retorno de una función, que puede saltar a algunos conocidos de la dirección con su código. Pero, a continuación, OS escritores respondió de forma aleatoria a la dirección de código se ejecuta en…

    • Para empezar, ¿cómo se carga el código ejecutable lugares pero si todo el código del programa está en la no-ejecutable de la memoria? Espacio de direcciones de la aleatorización solo no evitar la ROP de exploits. Ver mi respuesta.
  7. 0

    Su código se ejecuta en el segmento de texto, no en la pila o montón (ambos de los cuales son para el almacenamiento de datos). Por lo que la organización es:

    <highest addresses>
    stack
    ...
    heap
    data section (initialized data & bss - uninitialized data) 
    code section (text)
    <lowest addresses> 

    La sección de código es ejecutable, sino inmutable. Este artículo de la wikipedia tiene más detalles: https://en.wikipedia.org/wiki/Data_segment

Dejar respuesta

Please enter your comment!
Please enter your name here