Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Etichette: Inserimento di parole incomprensibili Sequenze di caratteri ripetuti da parte di un nuovo utente o IP Modifica visuale: commutato
Riga 4:
 
== Introduzione ==
Il tipo di attacco Format String è una classe di vulnerabilità scoperte nel 1999, presenti prevalentemente in linguaggi di programmazione imperativi come il C. Un Format String Attack è formato da tre componenti fondamentali:
* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo, del linguaggio di programmazione, in una stringa user-friendly cioè leggibile dall’uomo. Alcune di queste sono:
: per capire come fare un Format String Attack bisgona sapere da cosa è composto:
 
* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo, del linguaggio di programmazione, in una stringa user-friendly cioè leggibile dall’uomo. Alcune di queste sono:
printf: per stampare su stdout
Riga 14 ⟶ 12:
snprintf: per stampare esattamente 'n' caratteri della stringa in ingresso nella seconda
 
* Format String: è l’argomento della format function ed è una stringa ASCII che contiene sia testo che parametri di formato, ad esempio:.
printf(“The magic number is %d\n”, 3);
 
* Format String Parameter definiscono il tipo di conversione da effettuare in relazione alla variabile presente nella format string. Ad esempio:
“%s”: per stampare una stringa
“%d”: per stampare degli interi
Riga 24 ⟶ 22:
 
== 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. Eseguendo questo semplice codice, ad esempio:
<source lang="c">
#include <stdio.h>
Riga 36 ⟶ 34:
il programma stamperà:
<source lang="c">
Valore variabilevar. A: 3 - Indirizzo var. A: 22ed7fdc7fdc
Valore variabilevar. B: 5 - Indirizzo var. B: 22ed7fd87fd8
</source>
se invece la printf() riceve come parametro una stringa "maligna" (senza controllarne le caratteristiche) il risultato sarebbe proprio un attacco di tipo format string.
Lo stack “cresce” verso indirizzi di memoria decrescenti, salvado le variabili del programma
 
== Attacchi possibili ==
'''Crash del programma'''
 
Un modo molto semplice per mandare in crash un programma è passando alla funzione printf() una stringa formattata in questo modo: <source lang="c">printf("s%s%s%s%s%s%s%s%s%s%s");</source>
 
Ogni "%s" cerca di visualizzare il contenuto della memoria da un certo indirizzo presente sullo stack fino al carattere terminatore.
Inserendo quindi molti “%s”, la probabilità di andare a leggere da un “illegal address” (cioè un indirizzo non mappato per questa funzione) sono molto elevate e se succede, causeremmo l’errore “''segmentation fault”'' crashando quindi il 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