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 di dati su buffer oltre i limiti della sua capienza. Sovrascrittura dati adiacenti.
Buffer Overflow [2] Introduzione Buffer Overflow [2] In determinate condizioni è possibile: Indurre un crash dell applicazione. Modificarne il comportamento. Forzare l esecuzione di codice arbitrario.
Indurre crash Stack Guard Introduzione Esempio #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> i n t f o o ( char i n ) { char buf [ 5 1 2 ] ; s t r c p y ( buf, i n ) ; } r e t u r n 0 ; i n t main ( i n t argc, char a r g v ) { r e t u r n f o o ( a r g v [ 1 ] ) ; }
Layout stack Stack Guard Introduzione 080483a0 <main>: <...> 80483b5: call 8048370 <foo> 80483ba: leave 80483bb: ret 08048370 <foo>: 8048370: push %ebp 8048371: mov %esp,%ebp 8048373: sub $0x218,%esp 8048379: mov 0x8(%ebp),%eax 804837c: mov %eax,0x4(%esp) 8048380: lea -0x208(%ebp),%eax 8048386: mov %eax,(%esp) 8048389: call 80482b8 <strcpy@plt> 804838e: leave 804838f: xor %eax,%eax 8048391: ret return address frame pointer buffer
Modificarne il comportamento Introduzione esempio [2] #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t c h e c k u s e r ( v o i d ) { r e t u r n 0 ; } i n t main ( i n t argc, char a r g v ) { i n t admin ; char buf [ 5 1 2 ] ; } admin=check user ( ) ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( admin == 1) system ( / b i n / sh ) ; e l s e r e t u r n 0 ;
Eseguire codice arbitrario Introduzione Tipico payload nop sled. shellcode. retaddress. <nop><nop><nop>... <shellcode><ret><ret><ret>..
Canarini Stack Guard Terminator Canaries Random Canaries Canarini Miniere di carbone fine 800 Evitare stragi in miniera sentono prima degli uomini le fughe di gas
Canarini digitali [1] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x01010101 ; char buf [ 5 1 2 ] ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( canary!= 0x01010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;
Canarini digitali [2] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x00010101 ; char buf [ 5 1 2 ] ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( canary!= 0x00010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;
Canarini digitali [3] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x00010101 ; char buf [ 5 1 2 ] ; g e t s ( buf ) ; i f ( canary!= 0x00010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;
scelta dei canarini Stack Guard Terminator Canaries Random Canaries valore del canarino ostacolo agli exploit maggior numero di funzioni bloccate strcpy, gets,... terminator canary: 0x000aff0d
prologo ed epilogo Stack Guard Terminator Canaries Random Canaries prologo 0804836b <foo>: 804836b: push $0x000aff0d 8048370: push %ebp 8048371: mov %esp,%ebp return address canary frame pointer epilogo 8048389: call 80482b8 <strcpy@plt> 804838e: leave 804838f: cmpl $0x000aff0d, (%esp) 8048396: jne canary_changed 8048398: xor %eax,%eax 804839a: ret buffer
Terminator canaries: problemi Terminator Canaries Random Canaries problemi canarino noto non blocca tutte le funzioni (read) frame pointer non protetto variabili locali non protette finestra di codice in cui agire
canarini random Stack Guard Terminator Canaries Random Canaries canarini random variabile globale inizializzata all avvio del processo xor con return address difficile da ricavare (a meno di casi particolari)
Random canaries: problemi Terminator Canaries Random Canaries risolvono: canarino noto non blocca tutte le funzioni (read) non risolvono: frame pointer non protetto variabili locali non protette finestra di codice in cui agire
esempio: Stack Guard Terminator Canaries Random Canaries codice vulnerabile int func(char *msg) { char buf[80]; } strcpy(buf, msg);... strcpy(msg, buf);
esempio: Stack Guard Terminator Canaries Random Canaries codice vulnerabile [2] #include <stdio.h> #include <string.h> void bar(void) { printf("hello World!\n"); } int foo(char *in) { volatile int canary; void (*f)(void); char buf[512]; canary = 0x000aff0d; f = bar; strcpy(buf, in); f(); if(canary!= 0x000aff0d) { printf("smash detected!\n"); exit(0); } return 0; } int main(int argc, char **argv) { return foo(argv[1]); }
Pro police (SSP) Pro police (SSP) Hiroaki Etoh (IBM, 2000) canarini random controllo piu granulare riordinamento variabili integrato in gcc 4
riordinamento variabili riordinamento variabili canarini posti dopo frame pointer array e strutture contenenti array posti in alto restanti variabili locali appena sotto gli array controllo canarini piu granulare
SSP layout SSP layout overflow non influenzano var locali frame pointer protetto ret addr protetto parametri protetti check dei canarini dopo operazioni su array parametri retaddr frame pointer canary arrays local vars
ASLR Stack Guard ASLR obiettivi: complicare lavoro attaccante difetti: indirizzi di shellcode difficili da indovinare overhead limitato non tutto e randomizzabile (plt e testo)
ASLR Stack Guard cosa si randomizza posizione dello stack posizione dello heap indirizzo di rilocazione librerie
Problemi risolti e non: Problemi risolti: esecuzione shellcode su stack o heap modifica GOT piu difficile (ret to libc) Non risolti: ret to libc ancora possibile non control data attacks format bugs