Se stai usando il codice di esempio dal libro (sotto), a un certo punto dovresti raggiungere il pattern "AAAAAAAA" (0x41). Nota che, dato che lo stai eseguendo su una macchina a 64 bit che memorizza elementi nello stack con 8 byte ciascuno, dovresti eseguirlo con $ ./fmtstr "AAAAAAAA %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x %016x"
, altrimenti perderai parte di ogni elemento nello stack.
#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
}
Devi prestare attenzione alla citazione nel libro che afferma:
The fact that the fourth item shown (from the stack) was our format string depends on the nature of the format function used and the location of the vulnerable call in the vulnerable program. To find this value, simply use brute force and keep increasing the number of %08x tokens until the beginning of the format string is found. For our simple example (fmtstr), the distance, called the offset, is defined as 4.
Ricorda che il parametro che viene analizzato in printf
non è la stringa stessa, ma l'indirizzo della stringa. Quindi la posizione sul layout di memoria del programma in relazione allo stack printf
è ciò che definirà quanto più avanti dovrai cercare per trovarlo.