Respuestas:
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 ...
Para ampliar lo que ha dicho vonbrand (correctamente, +1), la protección de la pila de Linux tiene dos partes.
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 mybadfunction
funció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_fail
en 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
.
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 .rodata
secció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 mprotect
para agregar los permisos que desea a las páginas en las que residen los datos del shellcode.
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.
Para desactivarlo, echo 0 > /proc/sys/kernel/randomize_va_space
.
No. Cualquier exploit debe funcionar alrededor de los canarios de stack (muy poco trivial) y encontrar un programa con execstack
set, 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
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