Si está utilizando el código de ejemplo del libro (a continuación), en algún momento debe alcanzar el patrón "AAAAAAAA" (0x41). Tenga en cuenta que, dado que lo está ejecutando en una máquina de 64 bits que almacena elementos en la pila con 8 bytes cada uno, debe ejecutarlo con $ ./fmtstr "AAAAAAAA %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x"
en su lugar, o perderá parte de cada elemento en la pila.
#include <stdlib.h>
int main(int argc, char *argv[]){
static int canary=0; // stores the canary value in .data section
char temp[2048]; // string to hold large temp string
strcpy(temp, argv[1]); // take argv1 input and jam into temp
printf(temp); // print value of temp
printf("\n"); // print carriage return
printf("Canary at 0x%08x = 0x%08x\n", &canary, canary); //print canary
}
Debes prestar atención a la cita en el libro que dice:
El hecho de que el cuarto elemento mostrado (de la pila) fuera nuestra cadena de formato depende de la naturaleza de la función de formato utilizada y la ubicación de la llamada vulnerable en el programa vulnerable. Para encontrar este valor, simplemente use la fuerza bruta y siga aumentando el número de tokens% 08x hasta que se encuentre el comienzo de la cadena de formato. Para nuestro ejemplo simple (fmtstr), la distancia, llamada desplazamiento, se define como 4.
Recuerde que el parámetro que se está analizando a printf
no es la cadena en sí, sino la dirección de la cadena. Entonces, la posición en el diseño de memoria del programa en relación con el printf
stack es lo que definirá qué tan lejos tendrá que buscar para encontrarlo.