Deshabilite la protección de la stack en Ubuntu para el desbordamiento del búfer sin indicadores del comstackdor de C

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

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

La protección de la stack la realiza el comstackdor (agregue algunos datos adicionales a la stack y oculte algunos en la llamada, verifique la cordura en el momento de la devolución). No se puede deshabilitar sin volver a comstackr. Es parte del punto, realmente …

Para ampliar lo que dice vonbrand (correctamente, +1), hay dos partes en la protección de la stack de Linux.

Pila de canarios

Los canarios de stack son la característica obligatoria del comstackdor a la que se refiere vonbrand. Estos no se pueden desactivar sin una recompilation.

Para demostrarte esto 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 comstack eso ( gcc -fstack-protector -masm=intel -S test.c ) en algo gnu, ya que sería un gcc -fstack-protector -masm=intel -S test.c montar y leer el resultado. El punto importante es que al salir de la function mybadfunction , existe este pequeño fragment 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 stack de [ebp-12] y compararla con el valor en gs:20 . No coincide? Luego llama a una function __stack_chk_fail en glibc que mata su progtwig allí mismo.

Hay forms de evitar esto en términos de escritura de exploits, pero la manera más fácil en términos de crear un caso de testing de shellcode es comstackr su progtwig con -fno-stack-protector .

Páginas no ejecutables

Hay algunas otras consideraciones sobre los sistemas Linux modernos. Si toma el código de comprobación Shellcode habitual:

 char buffer[] = {...}; typedef void (* func)(void); int main(int argc, char** argv) { func f = (func) buffer; f(); return 0; } 

El moderno GCC / Linux .rodata sección .rodata del file PE de solo lectura sin permissions 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: utiliza mprotect para agregar los permissions que desea a las páginas en las que residen los datos de shellcode.

Pilas no ejecutables

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

 execstack -s /path/to/myprog 

Esto se puede hacer en progtwigs arbitrarios sin necesidad de una recompilation, pero no deshabilitará automáticamente canarios de stack, ya que estos se preparan en la compilation.

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 alnetworkingedor de stack canaries (no demasiado trivial) y encontrar un progtwig con execstack set, o establecerlo (lo que significa que ya puede ejecutar commands arbitrarios) o utilizar técnicas más difíciles, como return to libc / progtwigción orientada a la devolución.