Indirizzo danneggiato durante l'esecuzione della catena ROP a 64 bit

3

Sto cercando di imparare il binding ROP su una macchina Linux a 64 bit e ho riscontrato alcuni problemi. Sto usando il seguente codice per il buffer overflow (tratto da questo esercitazione ):

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *not_used = "/bin/sh";

void not_called() {
    printf("Not quite a shell...\n");
    system("/bin/date");
}

void vulnerable_function(char* string) {
    char buffer[100];
    strcpy(buffer, string);
}

int main(int argc, char **argv) {
    vulnerable_function(argv[1]);
    return 0;
}

Il problema che sto incontrando è che l'indirizzo del gadget ROP (da libc) è 0x7EFBF7B267DB che è l'indirizzo per un pop% rax; pop% rdi; chiama% rax ;. Tuttavia, se il mio carico utile è, ad esempio: \ x41 \ x41 \ x41 ..... \ x41 \ x41 \ xdb \ x67 \ xb2 \ xf7 \ xfb \ x7e \ x41 \ x41 \ x41 \ x41 \ x41 \ x41, quindi prova a chiamare 0x41417EFBF7B267DB invece di 0x7EFBF7B267DB. Non conosco alcun modo per aggirare questo. Qualche suggerimento?

    
posta William Moffitt 27.11.2016 - 21:41
fonte

1 risposta

3

Un indirizzo a 64 bit significa che ciascun indirizzo sarà lungo 8 byte. L'indirizzo a cui si desidera indirizzare è 0x00007EFBF7B267DB anziché 0x7EFBF7B267DB.
Cambia il tuo input in \ x41 \ x41 \ x41 ..... \ x41 \ x41 \ xdb \ x67 \ xb2 \ xf7 \ xfb \ x7e \ x00 \ x00 \ x41 \ x41 \ x41 \ x41 e il tuo codice dovrebbe funzionare bene.

EDIT dopo aver analizzato ulteriormente il problema nei commenti:
Questo collegamento di Reverse engineering SE mostra che ROP per una macchina a 64 bit può essere complicato soprattutto se si hanno byte null nell'indirizzo e il codice di exploit ha strcpy.
Il link suggerisce l'uso di una serie di bug e la creazione di una catena per risolvere il problema o se si desidera solo utilizzare un codice shell, quindi scrivere un cablaggio suggerito per il proprio codice shell.

    
risposta data 27.11.2016 - 22:27
fonte

Leggi altre domande sui tag