2012-10-23 3 views
7

Le compilateur moderne GCC est si puissant qu'il peut même empêcher le débordement de tampon en phase de compilation, de sorte que OS ne peut pas exécuter de code sur l'espace de pile.L'art du compilateur sur débordement de tampon

Par exemple:

void function(char *str) 
{ 
    char buffer[16]; 

    strncpy(buffer, str, 256); 
} 

void main() 
{ 
    char large_string[256]; 
    int i; 

    for(i = 0; i < 256; i++) 
    large_string[i] = 'A'; 

    function(large_string); 
} 

La seule façon que je peux obtenir le 0x41414141 magique est de régler le paramètre de compilation GCC tels que:

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

(je l'ai testé sur ubuntu 10.04 x86 lucide boîte de 32bits

Y at-il un moyen de contourner la protection de destruction de la pile GCC?

+0

À quelle limitation faites-vous référence, et pourquoi voulez-vous contourner ce que c'est? –

+0

Vous voulez intentionnellement corrompre la pile? Pourquoi? Et votre code a un bug, btw. Vous avez oublié de terminer la chaîne 'large_string' par NULL. Le 'strcpy()' ne sera pas limité à seulement 255 octets. –

+0

Je pense que vous voulez demander s'il est possible de contourner la protection de la pile gcc, si c'est le cas, vous devriez éditer la question pour que cela soit clair. – iabdalkader

Répondre

6

Vous devez désactiver la protection de la pile lors de la compilation:

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

Et vous pouvez également désactiver la randomisation de l'espace d'adressage (ASLR):

sudo sh -c 'echo 0 > /proc/sys/kernel/randomize_va_space' 

Maintenant, vous pouvez essayer les dépassements de mémoire tampon, je recommander la lecture Smashing the Stack for Fun and Profit

Modifier:

Comme je l'ai dit dans mon commentaire, il est sûr de supposer qu'il est acceptable dans votre mission pour désactiver la protection de la pile, cependant, si vous voulez by-pass la protection de la pile, vous devriez vérifier SOF pour la question relative à canaries comme cette question:

Is there any way to bypass SSP (StackSmashing Protection)/Propolice?

+0

Existe-t-il un moyen de briser directement la pile sans paramètre? – JustForTest

+0

Votre mission demande l'exploitation d'un buffer overflow Je pense qu'il est raisonnable de supposer que la désactivation de la protection de la pile est acceptable, sinon le problème est vraiment beaucoup plus compliqué. – iabdalkader

+0

oui, je le pense. Juste si curieux s'il y a un moyen de contourner une telle protection de pile puissante. De l'autre côté, est-ce exact de dire qu'il est sûr pour un code même s'il y a un trou de débordement dans la pile puisque le code dans la pile ne peut pas être exécuté après la compilation protégée par pile (le pire des cas est la fin du programme, le hacker ne peut pas exécuter le shellcode à travers lui) – JustForTest

1

il y a certainement des façons de contourner la pile de protection fracassant (appelé canaries pile) bien qu'il ne sera pas facile dans votre exemple. Voir ma réponse here pour certaines des faiblesses des canaris de la pile.

+0

Pourriez-vous donner un exemple simple et pratique pour de tels canaris de pile? – JustForTest

+0

@JustForTest: Je ne crains pas. La seule façon de contourner le canari de la pile dans votre exemple serait de l'écraser avec la même valeur. Comme il n'y a pas de vulnérabilité de fuites de mémoire, la seule façon de le faire est de le forcer brutalement ce qui n'est probablement pas viable ... – Job

Questions connexes