Come implementare i canarini per evitare overflow del buffer?

4

Questa è probabilmente una domanda molto semplice. Ho letto dei canarini e di come funzionano in teoria. Hai una variabile globale che imposti su un numero casuale nel prologo di una funzione, fai la tua funzione e verifica la sua autenticità nell'epilog.

void foobar(int a, int b)
{
   prolog();
   int c = a;
   int d = b;
   char *buffer[40];
   strcpy(stupidcopy);
   epilog();
}

Quello che non capisco è, come faccio a mettere qualcosa in pila in prolog? Ad esempio, se chiamo prologo e dico di salvare una variabile locale, sarà in pila, ma quando usciremo da prolog (), non verrà spuntato? Come posso salvare il canarino in pila? Devo modificare esp usando il codice assembly per farlo?

    
posta healthycola 16.06.2013 - 06:47
fonte

1 risposta

6

Di solito è il compilatore che genera i canarini. Prologo e epilogue non sono chiamate di funzione, sono le istruzioni che il compilatore colloca all'inizio e alla fine di una funzione.

Considera un compilatore ingenuo che mette le variabili nello stack nello stesso ordine in cui appaiono nel codice e non usa i registri. Quindi la tua funzione potrebbe diventare:

// variables on stack
int c;
int d;
char *buffer[40];
int canary;

// prologue
canary = secret;

// normal code
c=a;
d=b;
strcpy(stupidcopy);

// epilogue
if(canary != secret)
    OhNoesABufferOverflow();
return;

Non puoi scrivere questo codice da solo, dato che i compilatori possono ottimizzare lo spazio di archiviazione nello stack. Possono riordinare le variabili, tenerle nei registri e addirittura ottimizzare completamente canary poiché nessun codice ben educato farà mai scattare la condizione.

    
risposta data 16.06.2013 - 10:37
fonte

Leggi altre domande sui tag