Existe uma maneira de desativar a proteção contra estouro de buffer na minha máquina?

11

Quero fazer alguns experimentos com estouros de buffer em minhas várias máquinas virtuais, incluindo (mas não limitado a) Debian 6, Ubuntu 12.04, Fedora 16, mas toda vez que tento executar a exploração de buffer overflow, recebo a seguinte mensagem:

stack smashing detected (core dumped)

Depois de fazer minha pesquisa, li que é um recurso chamado proteção contra buffer overflow implementada no compilador. O GCC, por exemplo, usa o GCC Stack-Smashing Protector (ProPolice) , o Clang / LLVM usa dois detectores de buffer overflow, SafeCode e AddressSanitizer .

Minha pergunta é: Como eu realmente quero verificar ataques de estouro de buffer em minhas máquinas, existe uma maneira (um sinalizador de compilador, talvez? Um arquivo de configuração do linux?) Desativar a proteção de estouro de buffer?

NlightNFotis
fonte

Respostas:

16

GCC

No gcc ( man gcc), as verificações são ativadas 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.

Você pode desativar os dois anexando no-o nome da opção

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

LLVM / Clang

No LLVM / Clang ( http://clang.llvm.org/docs/UsersManual.html#commandline ) para ativar / desativar o AdressSanitizer:

-f [no-] sanitizer de endereço: ative o AddressSanitizer, um detector de erro de memória.

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

-f [no-] memsafety

Matteo
fonte
2
Existe uma maneira (simples) de detectar se um programa foi compilado com o SSP?
Michuelnik
2
@ Micheluelnik, você pode ver se o binário contém alguma referência a __stack_chk_fail(por exemplo,strings /bin/mybinary | grep __stack_chk_fail
Matteo
6
Eu só testei com GCC 4.7 e 4.1: opção -fno-stack-protector-allnão é reconhecido ( -fstack-protector, -fstack-protector-alle -fno-stack-protectorsão reconhecidos)
Marcin
gcc: error: unrecognized command line option ‘-fno-stack-protector-all’; did you mean ‘-fstack-protector-all’?
Clément