2016-01-06 2 views
0

Le système d'exploitation que j'utilise actuellement est Ubuntu 14.04 64 bits avec sa version gcc 4.8.4. J'ai écrit un programme simple comme montré ci-dessous pour faire quelques tests liés au débordement de tampon, et d'une manière ou d'une autre j'ai trouvé que je ne pouvais pas déborder correctement une chaîne de caractères locale.Pourquoi ne puis-je pas désactiver la protection de la pile?

/*test.c*/ 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int bof(char *str) 
{ 
    char buffer[4]; 
    strcpy(buffer, str); 
    return 1; 
} 

int main() 
{ 
    char str[]="123456789'; 

    /* This is the maximum length the string 
    can be, which is 16 bytes including the null character at the end, and 
    any strings that are longer than this would result in a segmentation fault */ 

    bof(str); 
} 

Ce programme a été compilé avec la commande

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

de sorte que pile soi-disant protection aurait été désactivé. Selon mon observation, toutes les chaînes de longueur inférieure ou égale à 16 caractères (y compris le caractère nul) seraient acceptables; sinon, cela provoquerait une erreur de segmentation.

Des pensées pourquoi et comment pourrais-je le faire fonctionner? Merci d'avance!

+2

Accéder à un tableau hors hors-limites est un comportement non défini ** ** comme l'étalon C. Pensez à la signification du mot "** undefined **". – Olaf

+0

Merci d'avoir commenté. Je comprends que l'accès hors-limites d'adresses est un comportement indéfini, ou du moins je pense que je le fais. Corrigez-moi si je me trompe, mais les adresses hors-limites ne sont-elles pas essentiellement des blocs de mémoire stockant des données pouvant être accédés et modifiés? Donc, si j'ai activé la protection de pile, ce qui me permettrait théoriquement de jouer avec ces adresses hors limites, et si je suis assez méticuleux pour garder mon code en ligne, devrais-je pouvoir utiliser ces mémoires? – glenjoker

+0

Si l'élément de pile auquel vous essayez d'accéder n'est pas mappé dans l'espace d'adressage actuel du processus, qu'espérez-vous exactement? autre qu'un signal? et pourquoi? – EJP

Répondre

0

vous pouvez utiliser GNU Debug pour trouver la distance, voici un tutoriel http://www.cs.umd.edu/~srhuang/teaching/cmsc212/gdb-tutorial-handout.pdf

+0

Bien sûr, j'ai pensé à apprendre à utiliser gdb pendant un moment, merci pour le lien. Comme pour les 8 octets supplémentaires décalés de l'adresse de retour, je ne suis pas très familier avec cela, mais je pense que Ubuntu est l'architecture x86? – glenjoker

+0

Je voulais dire que Ubuntu est architecture x86, mais N32 et N64 sont pour MIPS selon cette page wikipedia – glenjoker

+0

vous avez raison, si vous utilisez Ubuntu 64 bits alors votre processeur est x64. Je ne sais pas alors pourquoi il y a cet écart de 8 octets mais quand vous lisez des tutoriels sur les débordements de tampon, il est indiqué que l'adresse de retour ne peut pas être déterminée exactement (lorsque vous n'utilisez pas gdb) et vous devriez utiliser erreur, voir http://www-rn.informatik.uni-bremen.de/lehre/itsec/itsec05-2u.pdf, p. 4 (est en allemand) –