web-dev-qa-db-fra.com

Comment désactiver l'optimisation du compilateur gcc pour activer le dépassement de tampon

Je travaille sur un problème de devoirs qui nécessite de désactiver la protection d'optimisation du compilateur pour que cela fonctionne. J'utilise gcc 4.4.1 sur ubuntu linux, mais je ne peux pas déterminer quels drapeaux sont les bons. Je me rends compte que cela dépend de l'architecture - ma machine fonctionne avec un processeur Intel 32 bits.

Merci.

64
sa125

Voilà un bon problème. Afin de résoudre ce problème, vous devrez également désactiver ASLR, sinon l'adresse de g() sera imprévisible.

Désactiver ASLR:

Sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

Désactiver les canaris:

gcc overflow.c -o overflow -fno-stack-protector

Après la désactivation des canaris et de l'ASLR, cela devrait être une attaque directe comme celles décrites dans Briser la pile pour le plaisir et le profit

Voici une liste des fonctionnalités de sécurité utilisées dans ubuntu: https://wiki.ubuntu.com/Security/Features Vous n'avez pas à vous soucier des bits NX, l'adresse de g() sera toujours dans une région exécutable de la mémoire car elle se trouve dans le segment de mémoire TEXT. Les bits NX n'entrent en jeu que si vous essayez d'exécuter le shellcode sur la pile ou le tas, ce qui n'est pas requis pour cela. affectation.

Maintenant, allez et frappez cela [~ # ~] eip [~ # ~] !

87
rook

Urm, toutes les réponses jusqu'à présent étaient erronées, la réponse de Rook étant correcte.

Saisie:

echo 0 | Sudo tee /proc/sys/kernel/randomize_va_space

Suivi par:

gcc -fno-stack-protector -z execstack -o bug bug.c

Désactive ASLR, SSP/Propolice et NoneXec d'Ubuntu (qui a été placé en 9.10, et assez simple à contourner voir la technique mprotect (2) pour mapper des pages comme exécutables et jmp) devrait aider un peu, cependant ces "dispositifs de sécurité" ne sont en aucun cas infaillibles. Sans l'indicateur `-z execstack ', les pages ont des marquages ​​de pile non exécutables.

30
user1831086

Sur les distributions plus récentes (à partir de 2016), il semble que PIE soit activé par défaut, vous devrez donc le désactiver explicitement lors de la compilation.

Voici un petit résumé des commandes qui peuvent être utiles lors de la lecture locale avec des exercices de débordement de tampon en général:

Désactiver le canari:

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

Désactiver DEP:

gcc vuln.c -o vuln_disable_dep -z execstack

Désactiver PIE:

gcc vuln.c -o vuln_disable_pie -no-pie

Désactivez tous les mécanismes de protection répertoriés ci-dessus (avertissement: pour les tests locaux uniquement):

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

Pour les machines 32 bits, vous devrez ajouter le -m32 paramètre également.

15
Aydin K.

Essaie le -fno-stack-protector drapeau.

5
Kyle Lutz

Je sais que c'est un vieux fil, mais je tiens à souligner que vous n'avez pas besoin de désactiver ASLR pour faire un débordement de tampon! Bien que ASLR soit activé (kernel_randomize_va_space = 2), il ne prendra effet que si l'exécutable compilé est PIE, donc à moins que vous n'ayez compilé votre fichier avec l'indicateur -fPIC -pie, ASLR ne prendra pas effet.

Je pense que seule la désactivation des canaris avec -fno-stack-protector est suffisante. Si vous souhaitez vérifier si ASLR fonctionne ou non (le code indépendant de la position doit être défini), utilisez: hardening-check executable_name

4
AhlyM

Je ne citerai pas la page entière, mais le manuel complet sur l'optimisation est disponible ici: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize- Options

D'après les sons, vous voulez au moins -O0, la valeur par défaut et:

-fmudflap -fmudflapth -fmudflapir

Pour les frontaux qui le prennent en charge (C et C++), instrumentez toutes les opérations de déréférencement de pointeur/tableau risquées, certaines fonctions standard de chaîne/segment de bibliothèque et d'autres constructions associées avec des tests de plage/validité. Les modules ainsi instrumentés doivent être à l'abri des débordements de tampon, de l'utilisation de tas non valide et de certaines autres classes d'erreurs de programmation C/C++. L'instrumentation repose sur une bibliothèque d'exécution distincte (libmudflap), qui sera liée à un programme si -fmudflap est fourni au moment de la liaison. Le comportement à l'exécution du programme instrumenté est contrôlé par la variable d'environnement MUDFLAP_OPTIONS. Voir env MUDFLAP_OPTIONS = -help a.out pour ses options.

2
user257111