2017-05-16 4 views
1

J'ai un exercice qui me demande de produire un seg.fault. Dans ma compréhension, je peux le faire en débordant le tampon. Donc tout ce que j'ai besoin de faire est de fournir une entrée (Nom) plus grande qu'une certaine taille (couvrant l'adresse de retour). Donc, si buf, i et c contiennent 52 octets et ebp 4, alors l'adresse de retour devrait être après 56 octets. Donc, si je donne une entrée plus grande que 56, cela devrait produire un seg.fault. Est-ce que ma pensée est correcte? J'ai essayé avec ces chiffres, mais il fonctionne encore et sortie correctement. (UNIX 32 bits)Simple Buffer Overflow

#include <stdio.h> 
#include <sys/mman.h> 
#include <string.h> 
#include <stdlib.h> 

#define BUFSIZE 44 

char grade = '3'; 
char Name[BUFSIZE]; 

void readString(char *s) { 
    char buf[BUFSIZE]; 
    int i = 0; 
    int c; 

    while (1) { 
     c = fgetc(stdin); 
     if ((c == EOF) || (c == '\n')) 
     break; 
     buf[i++] = c; 
    } 
    buf[i] = 0; 

    for (i = 0; i < BUFSIZE; i++) 
     s[i] = buf[i]; 

    return; 
} 

int main(void) { 
    mprotect((void*)((unsigned int)Name & 0xfffff000), 1, 
      PROT_READ | PROT_WRITE | PROT_EXEC); 

    printf("What is your name?\n"); 
    readString(Name); 

    exit(0) 
} 
+0

Autre segfault: 'int ohno = * ((int *) NULL); printf ("% d", ohno); ' – InternetAussie

Répondre

1

Ce morceau de code vous protège d'une erreur de segmentation.

for (i = 0; i < BUFSIZE; i++) 
     s[i] = buf[i]; 

Vous pouvez quitter la fin de la matrice buf, mais c'est sur la pile.

Pourquoi pas seulement?

*(int*)(0x00000000) = 0; 
+0

L'exercice s'appelle Buffer Overrun Attack, donc je dois supposer qu'ils veulent que je le fasse de cette façon. De toute façon, si vous écrivez sur la pile sur l'adresse de retour (EIP), cela ne devrait-il pas en produire un si l'adresse de retour est ailleurs? – GKoo

+0

gratter ça, je l'ai fait en me faisant trop grand. – GKoo

0

à mon avis, la pile a été aligné mot, si votre buf [BUFSIZE], il aura un trou avec le code de démontage du local i et c variable.it comme ceci:

4005d4: 55      push %rbp 
    4005d5: 48 89 e5    mov %rsp,%rbp 
    4005d8: 48 83 ec 50    sub $0x50,%rsp 
    4005dc: 48 89 7d b8    mov %rdi,-0x48(%rbp) 
    4005e0: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp) 

c'est pile créer 90 octets, donc vous voulez changer rbp doit entrer beaucoup. donc si vous voulez changer l'autre valeur comme rbp, vous devez entrer plus de 64. malheureusement, cela peut ne pas fonctionner, parce que quand vous passez par l'emplacement i, votre valeur d'entrée va changer la valeur i, donc le buff [i ++] peut ne pas vouloir la position que vous voulez. Donc la meilleure façon de changer rpb est juste de sauter à travers la pile qui a subed dans le premier.

+0

la valeur i ne sera pas modifiée, car le gcc utilise la valeur de store store i, sauf si vous ajoutez volatil avant i variable –

+0

si vous voulez juste crash, il suffit d'appeler abort –