¿Cómo implementar canaries para evitar desbordamientos de búfer?

4

Esta es probablemente una pregunta muy básica. He leído sobre canarios y cómo funcionan en teoría. Tiene una variable global que establece en un número aleatorio en el prólogo de una función, hace su función y luego verifica su autenticidad en el epílogo.

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

Lo que no entiendo es, ¿cómo coloco algo en la pila en el prólogo? Al igual que si llamo a prólogo y le digo que guarde una variable local, estará en la pila, pero cuando salgamos de prólogo (), ¿no se abrirá? ¿Cómo puedo guardar el canario en la pila? ¿Necesito modificar esp usando el código de ensamblaje para hacer esto?

    
pregunta healthycola 16.06.2013 - 06:47
fuente

1 respuesta

6

Normalmente es el compilador el que genera canarios. Prologue y epilogue no son llamadas a funciones, son las instrucciones que el compilador coloca al principio y al final de una función.

Considere un compilador ingenuo que coloca las variables en la pila en el mismo orden en que aparecen en el código y no usa registros. Entonces tu función podría convertirse en:

// 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;

No puede escribir este código usted mismo, ya que los compiladores pueden optimizar el almacenamiento en la pila y hacerlo. Pueden reordenar las variables, mantenerlas en los registros e incluso podrían optimizar canary por completo, ya que ningún código de buen comportamiento activará la condición.

    
respondido por el CodesInChaos 16.06.2013 - 10:37
fuente

Lea otras preguntas en las etiquetas