¿Hay alguna forma de desactivar la protección contra desbordamiento de búfer en mi máquina?

11

Quiero hacer algunos experimentos con desbordamientos de búfer en mis diversas máquinas virtuales, que incluyen (pero no se limitan a) Debian 6, Ubuntu 12.04, Fedora 16, pero cada vez que intento ejecutar el exploit de desbordamiento de búfer recibo el siguiente mensaje:

stack smashing detected (core dumped)

Después de hacer mi investigación, leí que es una característica llamada protección de desbordamiento de búfer implementada en el compilador. GCC, por ejemplo, usa GCC Stack-Smashing Protector (ProPolice) , Clang / LLVM usa dos detectores de desbordamiento de búfer, SafeCode y AddressSanitizer .

Mi pregunta es: dado que realmente quiero ver los ataques de desbordamiento del búfer en mis máquinas, ¿hay alguna forma (un indicador de compilación, tal vez? Un archivo de configuración de Linux?) Para desactivar la protección de desbordamiento del búfer?

NlightNFotis
fuente

Respuestas:

16

CCG

En gcc ( man gcc) las comprobaciones están habilitadas por

  -fstack-protector
      Emit extra code to check for buffer overflows, such as stack smashing attacks.  >This is done by adding a guard variable to functions with
      vulnerable objects.  This includes functions that call alloca, and functions with >buffers larger than 8 bytes.  The guards are initialized when
      a function is entered and then checked when the function exits.  If a guard check >fails, an error message is printed and the program exits.

  -fstack-protector-all
      Like -fstack-protector except that all functions are protected.

Puede deshabilitar ambos precediendo no-al nombre de la opción

-fno-stack-protector -fno-stack-protector-all

LLVM / Clang

En LLVM / Clang ( http://clang.llvm.org/docs/UsersManual.html#commandline ) para habilitar / deshabilitar AdressSanitizer:

-f [no-] desinfectante de direcciones: active AddressSanitizer, un detector de errores de memoria.

y SAFECode ( http://safecode.cs.illinois.edu/docs/UsersGuide.html )

-f [no-] memsafety

Matteo
fuente
2
¿Hay alguna forma (simple) de detectar si un programa se ha compilado con SSP?
Michuelnik
2
@Michuelnik se puede ver si el binario contiene alguna referencia a __stack_chk_fail(por ejemplo,strings /bin/mybinary | grep __stack_chk_fail
Matteo
66
i simplemente probado con GCC 4.7 y 4.1: opción -fno-stack-protector-allno se reconoce ( -fstack-protector, -fstack-protector-ally -fno-stack-protectorson reconocidos)
marcin
gcc: error: unrecognized command line option ‘-fno-stack-protector-all’; did you mean ‘-fstack-protector-all’?
Clément