03.06.2013 Views

Un modello integrato control-flow e data-flow per il rilevamento ...

Un modello integrato control-flow e data-flow per il rilevamento ...

Un modello integrato control-flow e data-flow per il rilevamento ...

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.

3.1. Debolezze dei modelli esistenti 29<br />

main<br />

main<br />

main.24<br />

main<br />

main.25<br />

main<br />

0x1234<br />

main<br />

1 2 3<br />

g.11<br />

msg<br />

main.25<br />

main<br />

4 5 6<br />

Figura 3.4: Passi dell’attacco al programma.<br />

Ci rimane quindi la possib<strong>il</strong>ità di attaccare <strong>il</strong> programma in modo da far assomigliare<br />

la prima write alla seconda, facendole scrivere lo stesso messaggio. I passi <strong>per</strong><br />

ottenere questo risultato sono <strong>il</strong>lustrati nella Figura 3.4 e descritti di seguito (si<br />

veda ad esempio [1] <strong>per</strong> informazioni sulle convenzioni di chiamata in <strong>Un</strong>ix/Intel):<br />

1. è stato letto l’input da chiedi nome f<strong>il</strong>e(), quindi la read() è stata eseguita.<br />

Lo stack contiene solo <strong>il</strong> frame di main()<br />

2. la f() parte e fa <strong>il</strong> setup del suo frame<br />

3. la strcpy() copia la stringa puntata da path in buf e sovrascrive <strong>il</strong> return<br />

address di f().<br />

conservato intatto<br />

È essenziale che <strong>il</strong> valore del frame pointer sullo stack sia<br />

4. la f() è ritornata, <strong>il</strong> suo frame è stato distrutto e sta <strong>per</strong> essere eseguito <strong>il</strong><br />

codice iniettato nel buffer<br />

5. lo shellcode fa una push del return address <strong>per</strong> g() ed esegue:<br />

push %ebp<br />

mov %esp, %ebp<br />

Il finto stack frame <strong>per</strong> g() è al suo posto<br />

6. lo shellcode fa la push dell’indirizzo di uno qualsiasi dei messaggi considerati<br />

validi <strong>per</strong> put msg() e del return address. Il punto di ritorno deve essere<br />

nell’ep<strong>il</strong>ogo di g() e precisamente a mov %ebp, %esp (o leave). Rimane da

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

Saved successfully!

Ooh no, something went wrong!