Posso eseguire uno sfruttamento del formato stringa per i sistemi x64? [chiuso]

4

Stavo cercando di replicare l'esperimento in Gray Hat Hacking - Third Edition , Capitolo 12, Informazioni sugli exploit stringa di formato, ma la loro architettura è IA32, mentre la mia è AMD a 64 bit. Pertanto quando controllo i valori nello stack con comandi come:

$ ./fmtstr "AAAAAAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x"   

Non compare nulla, che assomiglia alla sua rappresentazione in memoria (41414141 41414141). Perché il buffer di exploit non restituisce dati di memoria effettivi e sequenziali ?? Per maggiori informazioni, vedi l'immagine della sua console Aiuto!

    
posta Fernando Pérez 07.04.2017 - 17:20
fonte

1 risposta

5

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.

    
risposta data 07.04.2017 - 20:00
fonte

Leggi altre domande sui tag