Format string attack: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Riga 17:
printf(“The magic number is %d\n”, 3);
* Format String Parameter
“%s”: per stampare una stringa
“%d”: per stampare degli interi
“%c”: per stampare dei caratteri
“%x”: per stampare caratteri esadecimali
== Funzionamento dello stack ==
Lo stack è un'area di memoria in cui vengono salvate le variabili locali e i parametri passati alla funzione. La sua gesitone è di tipo LIFO e cresce verso indirizzi bassi.
<source lang="c">
#include <stdio.h>
void main(int argc , char* argv){
int A=3, B=5;
printf("Valore var. A: %d - Indirizzo var. A: %x\n", A, &A);
printf("Valore var. B: %d - Indirizzo var. B: %x\n", B, &B);
}
</source>
il programma stamperà:
<source lang="c">
Valore variabile A: 3 - Indirizzo var. A: 22ed7fdc
Valore variabile B: 5 - Indirizzo var. B: 22ed7fd8
</source>
Lo stack “cresce” verso indirizzi di memoria decrescenti, salvado le variabili del programma
Se si passa a una funzione che stampa una stringa a schermo (un esempio classico è la funzione [[printf]] del [[C (linguaggio)|linguaggio C]]) una stringa che in realtà contiene una serie di parametri di specifica dell'input (tipicamente si usano identificatori di formato ''%s'' e ''%x'' per esaminare il contenuto della memoria e ''%n'' per sovrascrivere parti della memoria, in particolare dello [[stack]]) si permette l'avvio di un attacco di tipo [[stack overflow]] e ''return to libc''. Per proteggersi da questo attacco, quando si vuole stampare una stringa ''s'' usando la printf() o una qualsiasi funzione C che accetti un numero illimitato di identificatori di formato, bisogna scrivere la funzione
e non scrivere
|