Format String Vulnerability

Documenti analoghi
JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Dati due punti sul piano calcolare la loro distanza

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Introduzione al linguaggio C Primi programmi

Esercitazione di Reti degli elaboratori

Stack-based buffer overflow

ELEMENTI DI INFORMATICA. Linguaggio C

Corso di Informatica A.A

Scrittura formattata - printf

Primi programmi in C

Introduzione alla programmazione in linguaggio C

File e puntatori a file

Lezione 11: Liste a Puntatori e Input/Output

I CARATTERI E LE STRINGHE

Variabili e Istruzioni

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

Il linguaggio C. Puntatori e dintorni

Sistemi Operativi (M. Cesati)

Sistemi a microprocessore

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Lezione 6 Introduzione al C++ Mauro Piccolo

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

Lezione 22: Input/Output e Files

Codifica dell informazione

Primi passi col linguaggio C

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

File binari e file di testo

Input/Output su disco

L AMBIENTE CODE BLOCKS E L IO

Caratteri e stringhe

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Fondamenti di Informatica Laurea in Ingegneria Civile e Ingegneria per l ambiente e il territorio

Corso sul linguaggio C Modulo Tipi di dato

Introduzione al linguaggio C Puntatori

Spazio di indirizzamento virtuale

1

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Processore Danilo Dessì. Architettura degli Elaboratori.

L AMBIENTE CODE BLOCKS E L IO

Algoritmi, Strutture Dati e Programmi. UD 1.d: Dati e Tipi di Dato

Rappresentazione di interi

Sistemi Operativi Teledidattico

Caratteri e stringhe

Pagina 1 irc.azzurra.org:6667 #hacklab

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

Informatica Generale Andrea Corradini I linguaggi di programmazione

LIBRERIE STANDARD in C Le librerie standard

Fetch Decode Execute Program Counter controllare esegue prossima

Introduzione alla programmazione in C

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

Gestione dei file in C

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 - Programma

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Laboratorio di Programmazione

Unita aritmetica e logica. Input e output della ALU. Rappresentazione degli interi. Rappresentazione in modulo e segno. Aritmetica del calcolatore

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 5 31/10/2013

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

ALGORITMI E STRUTTURE DATI

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

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Ingresso ed Uscita in C. Informatica 1 / 15

Sistemi Operativi (M. Cesati)

Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori

Architettura degli Elaboratori e Laboratorio. Matteo Manzali Università degli Studi di Ferrara Anno Accademico

Informatica per le discipline umanistiche 2

ciclo di vita della soluzione (informatica) di un problema

Fondamenti di Informatica L-A

file informatica e laboratorio di programmazione Alberto Ferrari Informatica e Laboratorio di Programmazione

Esercizi Programmazione I

Architettura di un calcolatore: introduzione. Calcolatore: sottosistemi

La codifica binaria. Fondamenti di Informatica. Daniele Loiacono

Stringhe e tipi di dati strutturati

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

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

La protezione dai memory error exploit

INFORMATICA CORSO DI INFORMATICA DI BASE ANNO ACCADEMICO 2015/2016 DOCENTE: SARRANTONIO ARTURO

L apertura di un file ci restituisce un puntatore a una struttura chiamata FILE fopen:

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 02/04/2014/ Appello straordinario/ Foglio delle domande / VERSIONE 1

Introduzione al linguaggio macchina

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Linguaggi di Programmazione

Implementazione di DFA in C

I puntatori Referencing e Dereferencing Tipi e Dichiarazioni Assegnazioni. Programmazione 1. Lezione 11. Vincenzo Marra.

C: panoramica. Violetta Lonati

La scorsa lezione. Laboratorio di Architettura. Word e bytes... Questa lezione. Lezione 8

Tipi di dato semplici

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

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

Modello di von Neumann

Transcript:

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

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

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

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 1999. Mentre il buffer overflow fa la sua comparsa nelle prima metà anni 80. Il Format string è stato realizzato nel Giugno del 2000. Il buffer overflow si presenta prepotentemente negli anni 90. Il Format string è molto più semplice da ricercare rispetto alla vulnerabilità del buffer overflow.

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....

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

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.

(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.

(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.

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) ; }

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") ;

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") ;

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.

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=0x08480110 printf("\x10\x01\x48\x08_%08x.%08x.%08x %s ") ;

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

(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>

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

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.

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.

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 = 3221225442). questo problema può essere risolto basandoci su una caratteristica dell architettura CISC, che permette di scrivere, indirizzi disallineati in memoria.

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]) ;... }

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.

Algoritmo del calcolatore ad orologio (2) algoritmo dell orologio if( already_written > write_byte ){ padding = 256 - ((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 ;

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.

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>

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*/

Link Utili Format string Link Utili http://www.team-teso.net/articles/formatstring/ http://www.0xdeadbeef.info/ http://idea.sec.dico.unimi.it/~andrew/