1

J'essaie de transformer certains des programmes en gera's Insecure Programming by example en applications client/serveur qui pourraient être utilisées pour capturer les scénarios d'indicateur pour enseigner le développement d'exploit. Le problème que j'ai est que je ne suis pas sûr comment Visual Studio (j'utilise 2005 Professional Edition) décide où allouer des variables sur la pile.Comment Visual Studio détermine-t-il l'ordre dans lequel les variables de pile doivent être allouées?

Quand je compiler et exécuter l'exemple 1:

int main() { 
    int cookie; 
    char buf[80]; 

    printf("buf: %08x cookie: %08x\n", &buf, &cookie); 
    gets(buf); 

    if (cookie == 0x41424344) 
     printf("you win!\n"); 
} 

Je reçois le résultat suivant:

buf: 0012ff14 cookie: 0012ff64 

buf commence à une adresse quatre-vingts octets inférieur à cookie, et les quatre octets qui sont copiés dans buf après les quatre-vingt premiers apparaîtra dans cookie.

Le problème que j'ai est quand je place ce code dans une autre fonction. Lorsque je compile et exécute le code suivant, j'obtiens un résultat différent: buf apparaît à une adresse supérieure à cookie.

void ClientSocketHandler(SOCKET cs){ 
int cookie; 
char buf[80]; 
char stringToSend[160]; 
int numBytesRecved; 
int totalNumBytes; 

sprintf(stringToSend,"buf: %08x cookie: %08x\n",&buf,&cookie); 
send(cs,stringToSend,strlen(stringToSend),NULL); 

Le résultat est:

buf: 0012fd00 cookie: 0012fcfc 

Maintenant, il n'y a aucun moyen de définir cookie par l'intermédiaire des données arbitraires buf écraser. Est-il possible de dire à Visual Studio d'allouer cookie avant buf? Est-il possible de dire à l'avance comment les variables seront attribuées?

Merci,

Jason

Ah, d'accord. Oui, je suppose que les structures devront faire. Merci pour l'aide.

Répondre

2

Essayez de désactiver les optimisations du compilateur.

Si les optimisations sont déjà désactivées, la meilleure solution pour forcer le compilateur à placer les sections locales dans un ordre spécifique consiste à placer les variables locales dans une structure et à allouer cette structure à la pile locale. Les champs de cette structure sont moins susceptibles d'être déplacés (les uns par rapport aux autres) par le compilateur que les variables locales indépendantes.

Questions connexes