Existe-t-il un moyen de désactiver la protection contre le débordement de tampon sur ma machine?

11

Je veux faire quelques expériences avec des débordements de tampon sur mes différentes machines virtuelles, y compris (mais sans s'y limiter) Debian 6, Ubuntu 12.04, Fedora 16, mais chaque fois que j'essaie d'exécuter l'exploit de débordement de tampon, j'obtiens le message suivant:

stack smashing detected (core dumped)

Après avoir fait mes recherches, j'ai lu qu'il s'agit d'une fonctionnalité appelée protection contre le débordement de tampon implémentée dans le compilateur. GCC utilise par exemple GCC Stack-Smashing Protector (ProPolice) , Clang / LLVM utilise deux détecteurs de débordement de tampon, SafeCode et AddressSanitizer .

Ma question est: comme je veux vraiment vérifier les attaques de débordement de tampon sur mes machines, existe-t-il un moyen (un indicateur de compilateur, peut-être? Un fichier de configuration Linux?) Pour désactiver la protection contre le débordement de tampon?

NlightNFotis
la source

Réponses:

16

GCC

Sur gcc ( man gcc), les vérifications sont activées par

  -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.

Vous pouvez désactiver les deux en ajoutant no-le nom de l'option

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

LLVM / Clang

Sur LLVM / Clang ( http://clang.llvm.org/docs/UsersManual.html#commandline ) pour activer / désactiver AdressSanitizer:

-f [no-] address-sanitizer: activez AddressSanitizer, un détecteur d'erreur de mémoire.

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

-f [non-] memsafety

Matteo
la source
2
Existe-t-il un moyen (simple) de détecter si un programme a été compilé avec SSP?
Michuelnik
2
@Michuelnik, vous pouvez voir si le binaire contient une référence à __stack_chk_fail(par exemple,strings /bin/mybinary | grep __stack_chk_fail
Matteo
6
je viens de le tester avec GCC 4.7 et 4.1: l'option -fno-stack-protector-alln'est pas reconnue ( -fstack-protector, -fstack-protector-allet -fno-stack-protectorsont reconnues)
marcin
gcc: error: unrecognized command line option ‘-fno-stack-protector-all’; did you mean ‘-fstack-protector-all’?
Clément