Deshabilite la protección de la pila en Ubuntu para el desbordamiento del búfer sin los indicadores del compilador de C

10

Me gustaría probar algunos códigos de shell y quiero deshabilitar las protecciones de Linux.

Sé que podría compilar usando banderas, pero sé que existe otra forma de deshabilitar estas protecciones en general, simplemente no puedo recordar. ¿Me puedes ayudar?

Phate
fuente

Respuestas:

6

La protección de la pila la realiza el compilador (agregue algunos datos adicionales a la pila y guarde algunos en la llamada, verifique la cordura al regresar). No se puede desactivar eso sin volver a compilar. Es parte del punto, realmente ...

vonbrand
fuente
66
ASLR requiere que el sistema operativo lo haga en tiempo de ejecución. Los bits NX también requieren soporte del sistema. ¿Qué parte no se puede deshabilitar en tiempo de ejecución?
Jeff Ferland
25

Para ampliar lo que ha dicho vonbrand (correctamente, +1), la protección de la pila de Linux tiene dos partes.

Apilar canarios

Los canarios de pila son la característica forzada por el compilador a la que se refiere vonbrand. Estos no se pueden deshabilitar sin una recompilación.

Para demostrarte esto a ti mismo y ver cómo funcionan, toma el siguiente código:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

Ahora compile that ( gcc -fstack-protector -masm=intel -S test.c) en algo gnu, ya que estaría encantado de ensamblar y leer la salida. El punto importante es que al salir de la mybadfunctionfunción, hay este pequeño fragmento de código:

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

Como puedes adivinar, eso es tomar una cookie de pila [ebp-12]y compararla con el valor en gs:20. No coincide? Luego llama a una función __stack_chk_failen glibc que mata su programa allí mismo.

Hay formas de evitar esto en términos de escribir exploits, pero la forma más fácil en términos de construir un caso de prueba de shellcode es compilar su programa -fno-stack-protector.

Páginas no ejecutables

Hay algunas otras consideraciones sobre los sistemas Linux modernos. Si toma el código auxiliar de prueba de shellcode habitual:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

GCC / Linux moderno asignará la .rodatasección del archivo PE de solo lectura sin permisos de ejecución. Debe desactivarlo, lo que se puede hacer utilizando el ejemplo de código de esta publicación de blog . Idea básica: se usa mprotectpara agregar los permisos que desea a las páginas en las que residen los datos del shellcode.

Pilas no ejecutables

Si va a probar un escenario de explotación tradicional, por ejemplo, mi código incorrecto anterior, con su código de shell, entonces también debe asegurarse de que la pila sea ejecutable para los casos simples. El formato de archivo PE contiene un campo para determinar si la pila es ejecutable; puede consultar y controlar esto con execstack . Para habilitar una pila ejecutable, ejecute

execstack -s /path/to/myprog

Esto se puede hacer en programas arbitrarios sin necesidad de una recompilación, pero no deshabilitará automáticamente los canarios de pila, ya que se compilan en la compilación.

Bonificación adicional: aslr:

Para desactivarlo, echo 0 > /proc/sys/kernel/randomize_va_space.

¿Acabas de decirle a alguien cómo explotar mi precioso pingüino?

No. Cualquier exploit debe funcionar alrededor de los canarios de stack (muy poco trivial) y encontrar un programa con execstackset, o establecerlo (lo que significa que ya puede ejecutar comandos arbitrarios de todos modos) o usar técnicas más difíciles, como return to libc / return programación orientada

Jonathan Leffler
fuente
0

Puede deshabilitar algunas protecciones (detección de aplastamiento de la pila y hacer que la pila sea ejecutable) con estas opciones.

--z execstack
-f no-stack-protector

También puede desactivar ASLR (aleatorización del diseño del espacio de direcciones) con Bash con el comando:

echo 0 > /proc/sys/kernel/randomize_va_space
gotoat
fuente