Format String Vulnerability

Размер: px
Начинать показ со страницы:

Download "Format String Vulnerability"

Транскрипт

1 Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Informatica April 15, 2005

2 Sommario 1 Format string Definizione Format function Componenti delle Format function Funzionamento delle Format function 2

3 Sommario 1 Format string Definizione Format function Componenti delle Format function Funzionamento delle Format function 2

4 Definizione Format function Componenti delle Format function Funzionamento delle Format function Introduzione Format string vs. Buffer Overflow La vulnerabilità del format string è stata pubblicata per la prima volta nel Giugno Mentre il buffer overflow fa la sua comparsa nelle prima metà anni 80. Il Format string è stato realizzato nel Giugno del Il buffer overflow si presenta prepotentemente negli anni 90. Il Format string è molto più semplice da ricercare rispetto alla vulnerabilità del buffer overflow.

5 Definizione Format function Componenti delle Format function Funzionamento delle Format function Definizione Format function Def. Format function Sono funzioni di conversione che sono usate per rappresentare i tipi di dati nel linguaggio C, in modo leggibile dall essere umano. Queste funzioni vengono usate per stampare informazioni, errori o per processare stringhe. fprintf: stampa su FILE stream. printf: stampa su stdout stream. sprintf: stampa all interno di una stringa snprintf: stampa all interno di una stringa con controllo della lunghezza....

6 Definizione Format function Componenti delle Format function Funzionamento delle Format function Format string Format function printf("il numero scelto e : %d\n", 1911); parametri output tipo di passaggio %d decimale per valore %u decimale senza segno per valore %x esadecimale per valore %s stringa per riferimento %n numero di byte scritti fin ora per riferimento

7 Definizione Format function Componenti delle Format function Funzionamento delle Format function Funzionamento delle Format function Format function printf("numero %d all indirizzo: %08x di lunghezza %d", i, &i, n); Il format string controlla il comportamento della funzione. specifica il tipo di parametri che devono essere stampati. i parametri sono salvati sullo stack.

8 (1) La vulnerabilità del format string può essere classificata, come channeling problem. Il channeling problem si può verificare quando informazioni di controllo e informazioni dati, coesistono nello stesso canale. L ipotesi di sfruttamento del channeling problem si ha quando l utente può specificare nello stesso canale di comunicazione sia dati che informazioni di controllo.

9 (2) Situazione Canali Dati Canali controllo Problemi Phone System Voce/dati Toni di contr. contr. can. Stack Dati Stack Ret contr. ret Malloc buffers dati Malloc Gestore info scri. in mem Format strings Stringa Out par. di formato contr func.

10 Esempio di vulenrabilità esempio vulnerabilità Codice contenente vulnerabilita int func(char * user) { printf(user) ; } Codice non contenente vulnerabita int func(char *user) { printf("%s", user) ; }

11 Attaco di tipo DoS Un semplice attacco che può essere portato a termine sfruttando la vulenrabilità del format string è quello di far terminare il processo vittima, causando di fatto un DoS (Esempio DNS spoofing). Per sfruttare l attacco si può utilizzare il formattatore %s: printf("%s%s%s%s%s%s%s%s%s%s") ;

12 Memoria stack del processo Memoria Stack del processo Un altro tipo di attacco che può essere portato a termine è rivolto all information gathering dei dati in memoria stack: Per portare a termine l attacco si può utilizzare il formattatore %x: printf("%08x.%08x.%08x.%08x.%08x.%08x") ;

13 Locazione arbitraria di memoria del processo (1) Locazione arbitraria di memoria L ipotesi per poter sfruttare questa tipologia d attacco sono due: formattatore che usa un indirizzo (per riferimento) come parametro dello stack, e visualizza la memoria dall indirizzo fornito. riuscire a fornire alla funzione format string l indirizzo da cui visualizzare la memoria.

14 Locazione arbitraria di memoria del processo (2) Locazione arbitraria di memoria La prima ipotesi, viene soddisfatta tramite il formattatore %s La seconda ipotesi, invece viene soddisfatta, fornendo l indirizzo come stringa alla format funcion. Esempio: address=0x printf("\x10\x01\x48\x08_%08x.%08x.%08x %s ") ;

15 (1) esempio di codice vulnerabile (QPOP 2.53) { char outbuf[512] ; char buffer[512] ; sprintf(buffer, "ERR Wrong command: %s", user) ; sprintf(outbuf, buffer) ; }

16 (2) Injection vector (QPOP 2.53) La dimensione del buffer user viene controllata, in modo che non ecceda i 512 byte. La vulnerabilità viene sfruttata attraverso il seguente injection vector: %497d\x3c\xd3\xff\xbf<nops><shellcode>

17 Esempio programmativo (wu-ftpd 2.6.0) { char buffer[512] ; snprintf( buffer, sizeof(buffer), user) ; buffer[sizeof(buffer) - 1] = \0 ; }

18 Sovrascrittura indirizzi (1) Sovrascrittura indirizzi in memoria Per poter sovrascrivere un indirizzo serve un formattatore in grado di poter scrivere in una cella di memoria (per riferimento). Si deve trovare un modo per poter scrivere nell indirizzo scelto un valore controllabile da noi.

19 Sovrascrittura indirizzi (2) Sovrascrittura indirizzi in memoria Per poter sovrascrivere un indirizzo si può utilizzare il formattatore %n, che scrive all indirizzo puntato dallo stack pointer, il numero di caratteri scritti fin ora. Per poter controllare quello che scriviamo, usiamo il padding presenti nei vari formattatori, per esempio %230u, esegue il padding della variabile a 230 caratteri.

20 Sovrascrittura indirizzi (3) Sovrascrittura indirizzi in memoria Esiste però un problema per la sovrascrittura: Non posso scrivere direttamente, per esempio, gli indirizzi dello stack, in quanto dovrei eseguire un padding di miliardi di caratteri (0xbfffffe2 = ). questo problema può essere risolto basandoci su una caratteristica dell architettura CISC, che permette di scrivere, indirizzi disallineati in memoria.

21 Sovrascrittura (4) Format string Sovrascrittura (4) {... printf("%16u%n", 7350, (int*) &foo[0]) ; printf("%32u%n", 7350, (int*) &foo[1]) ; printf("%64u%n", 7350, (int*) &foo[2]) ; printf("%128u%n", 7350, (int*) &foo[3]) ;... }

22 Algoritmo del calcolatore ad orologio (1) algoritmo dell orologio Quando sfruttiamo la vulnerabilità si deve tenere conto, che le scritture dell indirizzo avvengono sequenzialmente, quindi il numero di caratteri stampati si sommano ad ogni operazione. Quando scriviamo si deve tener conto di 2 parametri principali: byte scritti fin ora. valore da scrivere all indirizzo. nel caso che il valore da scrivere sia minore dei caratteri stampati fino a quell istante, si deve utilizzare l aritmetica in modulo, in particolare per scrivere all interno di byte (unsigned) aritmetica modulo 256.

23 Algoritmo del calcolatore ad orologio (2) algoritmo dell orologio if( already_written > write_byte ){ padding = ((already_written%256) - write_byte) ; if (padding < 4) padding += 256 ; } else if( already_written < write_byte ) { padding = write_byte - already_written; if (padding < 4) padding += 256 ; } already_written += padding ;

24 Parametri dell exploitation Parametri dell exploitation La prima informazione, che ci serve è il retloc, l indirizzo a cui è localizzato il return address. quante Word (32 bit) separano il puntatore del format string, relativo ai parametri della format function e il reale buffer contenuto in memoria. Indirizzo dello shellcode da eseguire.

25 Injection Vector Format string Injection vector dummy-addr-pair quattro coppie di interi dummy e indirizzi sui quale scrivere, gli indirizzi sono aumentati di 1 per ogni coppia. stackpop sequenza di stack popping che sposta il puntatore di riferimento ai parametri della format function. write-code parte della format string che esegue realmente la scrittura in memoria tramite i formattatori %nu%n. <dummy-addr-pair*4><stackpop><write-code>

26 Esempio Vulnerabilità Esempio programmativo int func(char *user, char *buffer, int len) { snprintf(buffer, len, user) ; buffer[len - 1] = \0 ; printf("%s\n", buffer) ; }/*endfunc*/

27 Link Utili Format string Link Utili

Esercitazione di Reti degli elaboratori

Esercitazione di Reti degli elaboratori Esercitazione di Prof.ssa Chiara Petrioli Christian Cardia, Gabriele Saturni Cosa vedremo in questa lezione? Gli Array Gli array multidimensionali Le stringhe I puntatori Esercizi Pagina 1 Gli Array Definizione

Подробнее

Stack-based buffer overflow

Stack-based buffer overflow Università degli Studi di Milano Facoltà di Scienze e Tecnologie Stack-based buffer overflow Andrea Lanzi A.A. 2015 2016 Andrea Lanzi Stack-based buffer overflow A.A. 2015 2016 1 / 19 Classificazione attacchi

Подробнее

Scrittura formattata - printf

Scrittura formattata - printf Esercizi su Input/Output con formato FormattedIO 1 Scrittura formattata - printf Funzione printf int printf ( , ) La funzione restituisce un valore intero uguale ai caratteri

Подробнее

Introduzione alla programmazione in linguaggio C

Introduzione alla programmazione in linguaggio C Introduzione alla programmazione in linguaggio C Il primo programma in C commento Header della libreria Funzione principale Ogni istruzione in C va terminata con un ; Corso di Informatica AA. 2007-2008

Подробнее

File e puntatori a file

File e puntatori a file File e puntatori a file Vitoantonio Bevilacqua [email protected] La libreria stdio.h mette a disposizione delle funzioni che hanno la peculiarità di trattare con questa nuova tipologia di

Подробнее

I CARATTERI E LE STRINGHE

I CARATTERI E LE STRINGHE I CARATTERI E LE STRINGHE IL CODICE ASCII Per memorizzare i simboli grafici corrispondenti ai caratteri bisogna associare un numero intero a ciascuno di essi Il codice ASCII / æski/ (American Standard

Подробнее

Variabili e Istruzioni

Variabili e Istruzioni Exit Menù Variabili e Istruzioni 1 Le Variabili Una VARIABILE è un oggetto identificato da un NOME e da uno STATO, detto CONTENUTO o VALORE. Possiamo immaginarla come una scatola contenuto Pippo 11 nome

Подробнее

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni Università di Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni Marco Liverani ([email protected])

Подробнее

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Подробнее

Lezione 6 Introduzione al C++ Mauro Piccolo

Lezione 6 Introduzione al C++ Mauro Piccolo Lezione 6 Introduzione al C++ Mauro Piccolo [email protected] Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,

Подробнее

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,

Подробнее

Primi passi col linguaggio C

Primi passi col linguaggio C Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Come introdurre un linguaggio di programmazione? Obiettivi: Introduciamo una macchina astratta

Подробнее

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C LIBRERIE STANDARD in C La libreria standard del C è in realtà un insieme di librerie Per usare una libreria, non occorre inserirla esplicitamente nel progetto: ogni ambiente di sviluppo sa già dove cercarle

Подробнее

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Подробнее

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma in C++ #include using namespace std; main() { cout

Подробнее

Spazio di indirizzamento virtuale

Spazio di indirizzamento virtuale Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 016-01 Spazio di indirizzamento virtuale Pietro Di Lena - [email protected] // The function name says it all int stack_overflow (){

Подробнее

Processore Danilo Dessì. Architettura degli Elaboratori.

Processore Danilo Dessì. Architettura degli Elaboratori. Processore 8088 Architettura degli Elaboratori Danilo Dessì [email protected] Subroutine Anche nel linguaggio assemblativo è possibile suddividere un programma in subroutine Per invocare una subroutine

Подробнее

L AMBIENTE CODE BLOCKS E L IO

L AMBIENTE CODE BLOCKS E L IO L AMBIENTE CODE BLOCKS E L IO Il primo programma #include main() { printf("ciao Mondo!"); } Il file deve essere salvato con estensione.c Il primo programma in C++ #include using

Подробнее

Caratteri e stringhe

Caratteri e stringhe Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un

Подробнее

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010 Tipi di dati scalari (casting e puntatori) Alessandra Giordani [email protected] Lunedì 10 maggio 2010 http://disi.unitn.it/~agiordani/ I tipi di dati scalari I tipi aritmetici, i tipi enumerativi

Подробнее

Informatica Generale Andrea Corradini I linguaggi di programmazione

Informatica Generale Andrea Corradini I linguaggi di programmazione Informatica Generale Andrea Corradini 17 - I linguaggi di programmazione Sommario Cos'è un linguaggio di programmazione? Una prospettiva storica: linguaggi di prima, seconda e terza generazione I paradigmi

Подробнее

Gestione dei file in C

Gestione dei file in C Gestione dei file in C Fondamenti di Informatica Che cos è un file e a cosa serve? Memoria di massa vs memoria centrale q La memoria di massa (disco fisso) è un dispositivo di memorizzazione generalmente

Подробнее

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Подробнее

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Подробнее

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C... Sommario PREFAZIONE...XI Aggiornamenti e novità... xi Lo scopo di questo libro... xii Diagramma delle dipendenze... xii La metodologia di insegnamento... xiii Panoramica sul libro... xvi Ringraziamenti...

Подробнее

Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori

Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori slide a cura di Salvatore Orlando & Marta Simeoni Architettura degli Elaboratori 1 Interi unsigned in base 2 Si utilizza un alfabeto

Подробнее

La codifica binaria. Fondamenti di Informatica. Daniele Loiacono

La codifica binaria. Fondamenti di Informatica. Daniele Loiacono La codifica binaria Fondamenti di Informatica Come memorizzo l informazione nel calcolatore? 1 bit di informazione 1 bit di informazione La memoria del calcolatore Introduzione q Il calcolatore usa internamente

Подробнее

Stringhe e tipi di dati strutturati

Stringhe e tipi di dati strutturati Stringhe e tipi di dati strutturati Marco D. Santambrogio [email protected] Ver. aggiornata al 21 Marzo 2013 Info sui Labs http://tinyurl.com/ieimlabextra Ricordate di portare un adattatore!

Подробнее

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio I/O da tastiera + costrutti while e if Alessandra Giordani [email protected] Lunedì 2 maggio 2011 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una

Подробнее

La protezione dai memory error exploit

La protezione dai memory error exploit Università degli Studi di Milano Sommario Introduzione 1 Stack Guard Terminator Canaries Random Canaries 2 3 Buffer Overflow Stack Guard Introduzione Buffer Overflow Condizione anomala. Memorizzazione

Подробнее

Implementazione di DFA in C

Implementazione di DFA in C Implementazione di DFA in C Dispensa di Laboratorio di Linguaggi di Programmazione Sommario Corrado Mencar, Pasquale Lops, Stefano Ferilli Questa dispensa fornisce le linee guida per l implementazione,

Подробнее

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Подробнее

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0 STRINGHE: ARRAY DI CARATTERI Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' s a p e \0 0 1 2 3 Un vettore di N caratteri può dunque ospitare stringhe lunghe al più N-1

Подробнее

Corso di Sicurezza Informatica. Sicurezza del software. Ing. Gianluca Caminiti

Corso di Sicurezza Informatica. Sicurezza del software. Ing. Gianluca Caminiti Corso di Sicurezza Informatica Sicurezza del software Ing. Gianluca Caminiti Software Sicuro Privo di errori (logici) che comportino un comportamento inatteso. Tali bug possono minare la sicurezza dell

Подробнее