rivista HAX #4 - Il mondo di Paolettopn
rivista HAX #4 - Il mondo di Paolettopn
rivista HAX #4 - Il mondo di Paolettopn
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