Printf inject 0x00

2

Quando si esegue un exploit stringa di formato, come si fa a iniettare un indirizzo contenente 0x00?

#include<stdio.h>

int main(int argc,char *argv[])
{
    char buf[80];
    snprintf(buf, 79, argv[1]);
    printf(buf);
}

Come otterresti un ret a libc se, per esempio, l'indirizzo del sistema è 00112233 (Little endian)

Dove l'indirizzo del sistema conteneva un byte null. Per usare la vulnerabilità printf, il tuo input è stato prima passato tramite snprintf, che si è fermato al primo tentativo di un byte null.

    
posta robertkin 22.01.2015 - 16:15
fonte

1 risposta

3

Per prima cosa probabilmente dovrai abilitare il supporto per il carattere% n poiché è disabilitato per impostazione predefinita su alcuni sistemi operativi. Il programma vulnerabile dovrebbe avere la seguente dichiarazione:

_set_printf_count_output(1);

Successivamente, dovrai determinare dove l'indirizzo di ritorno che desideri sovrascrivere è archiviato nello stack. In questo caso, potresti sovrascrivere l'indirizzo di ritorno di printf o main . Una di queste posizioni sarà necessario sovrascrivere con il valore 00112233.

È necessario sovrascrivere l'indirizzo di ritorno un byte alla volta generando un input a printf per essere l'equivalente di

printf("%naaaaaaaaaaa%naaaaaaaaaaa%naaaaaaaaaaa%n",&LSB,&LSB+1,&LSB+2,&MSB);

Il primo% n scriverà effettivamente un byte zero o null sull'indirizzo di ritorno LSB poiché il numero totale di caratteri che printf ha scritto in quel punto è zero. Il secondo% n stamperà il valore 11 sul secondo byte dell'indirizzo di ritorno, il terzo 22 e così via. Lo lascerò come esercizio per creare il vero carico utile [].

    
risposta data 22.01.2015 - 17:14
fonte

Leggi altre domande sui tag