30.05.2013 Views

rivista HAX #4 - Il mondo di Paolettopn

rivista HAX #4 - Il mondo di Paolettopn

rivista HAX #4 - Il mondo di Paolettopn

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Il</strong> segmento heap, invece, viene utilizzato per l'allocazione<br />

<strong>di</strong>namica <strong>di</strong> porzioni <strong>di</strong> memoria, come ad<br />

esempio per le strutture in c che vengono accedute<br />

tramite puntatori. E' da notare che questo segmento<br />

non ha una <strong>di</strong>mensione fissa ma può aumentare o<br />

<strong>di</strong>minuire in base alle necessità del programma. La<br />

fase <strong>di</strong> allocazione e <strong>di</strong> deallocazione delle porzioni<br />

<strong>di</strong> memoria viene gestita da algoritmi specializzati.<br />

<strong>Il</strong> segmento stack viene utilizzato per immagazzinare<br />

i dati durante il richiamo <strong>di</strong> funzioni. Esso funziona<br />

secondo uno schema FIFO, first-in first-out: il primo<br />

elemento inserito nello stack è l'ultimo ad essere<br />

estratto, come avverrebbe in una pila <strong>di</strong> piatti. Nel<br />

registro ESP viene mantenuto l'in<strong>di</strong>rizzo <strong>di</strong> memoria<br />

dell'ultimo elemento contenuto nello stack. Anche lo<br />

stack come l'heap non ha una <strong>di</strong>mensione fissa ma<br />

aumenta e <strong>di</strong>minuisce in modo <strong>di</strong>namico.<br />

Per comprendere i meccanismi che stanno <strong>di</strong>etro<br />

alle vulnerabilità del co<strong>di</strong>ce è anche importante conoscere<br />

alcuni registri della cpu.<br />

La cpu contiene numerosi registri, quelli che interessano<br />

a noi sono EIP e EBP.<br />

L'EIP (Instruction Pointer) contiene l'in<strong>di</strong>rizzo della<br />

successiva istruzione da eseguire.<br />

Nell''EBP (Base Pointer) ,viene salvato l'in<strong>di</strong>rizzo <strong>di</strong><br />

ESP prima che questo venga mo<strong>di</strong>ficato dalla chiamata<br />

<strong>di</strong> una funzione (che vedremo tra breve cosa<br />

comporta). Viene utilizzato per accedere alle informazioni<br />

del record <strong>di</strong> attivazione corrente sommando<br />

o sottraendo ad esso un'offset (calcolato in base alla<br />

<strong>di</strong>mensione occupata dalle variabili che precedono il<br />

punto in cui si vuole arrivare).<br />

Lo stack è molto importante per la gestione del flusso<br />

<strong>di</strong> esecuzione del programma perchè quando viene<br />

chiamata una funzione viene creato record <strong>di</strong> attivazione<br />

(o stack frame) in questo modo: prima vengono<br />

inseriti gli argomenti passati alla funzione in<br />

or<strong>di</strong>ne inverso (dall'ultimo al primo), poi viene inserito<br />

l'in<strong>di</strong>rizzo <strong>di</strong> ritorno contenuto in EIP, poi viene<br />

inserito il valore corrente contenuto nel registro EBP.<br />

I valori salvati nello stack <strong>di</strong> EBP e dell'in<strong>di</strong>rizzo <strong>di</strong><br />

ritorno servono per reimpostare i valori <strong>di</strong> EBP e EIP<br />

all'interno della cpu dopo che la funzione termina la<br />

sua esecuzione, in questo modo si può ritornare allo<br />

stato precedente della chiamata ad essa. Un esempio<br />

<strong>di</strong> record <strong>di</strong> attivazione quando dalla funzione<br />

main viene richiamata la funzione prova e quello<br />

nell'immagine 2.<br />

Ora che sappiamo come un programma viene rappresentato<br />

in memoria durante la sua esecuzione<br />

siamo in grado <strong>di</strong> capire come sfruttare eventuali<br />

vulnerabilità, ma prima bisogna trovarle!!!!<br />

Per questo scopo utilizziamo un debugger, un programma<br />

che ci permette <strong>di</strong> eseguire un programma<br />

passo passo e <strong>di</strong> vedere anche la sua rappresentazione<br />

in memoria, alcuni mostrano anche il programma<br />

in co<strong>di</strong>ce assembly. <strong>Il</strong> più famoso e utilizzato è<br />

GDB (GNU Debugger), in rete ci sono moltissime<br />

guide e inoltre moltissime informazioni è possibile<br />

reperirle nelle pagine <strong>di</strong> man con il comando:<br />

man gdb<br />

41<br />

Una tipica vulnerabilità del co<strong>di</strong>ce che interessa la<br />

memoria è quella del Buffer Overflow e si verifica<br />

quando si passano i limiti dello spazio <strong>di</strong> memoria<br />

allocato, andando a sovrascrivere lo spazio a<strong>di</strong>acente.<br />

Quin<strong>di</strong> è possibili non solo andare a sporcare aree<br />

<strong>di</strong> memoria ma anche riuscire ad iniettare del co<strong>di</strong>ce<br />

da far eseguire, e sta proprio qui il punto <strong>di</strong> forza<br />

<strong>di</strong> questa vulnerabilità!!!<br />

Pensate ad un programma per login che abbia una<br />

vulnerabilità <strong>di</strong> questo tipo :)!!!<br />

Infine vi lascio con un semplice programma:<br />

void prova(char* buff)<br />

{<br />

char buffer[10];<br />

strcpy(buffer,buf);<br />

}<br />

int main()<br />

{<br />

char buffer[30];<br />

int i = 0;<br />

for(i=0; i

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!