giovedì 19 aprile 2012

Il Buffer Overflow - la tecnica hacker per eccellenza

Il buffer overflow è un attacco che si presta molto a svariati obbiettivi ed è definita "la tecnica hacker per eccellenza".
Come al solito, anche in questo caso andremo ad unire il reversing all'hacking, e visto che la tecnica di buffer overflow va ad agire su un buffer contenuto, il più delle volte, in un programma, è ovvio che se avete già delle basi di reverse engineering avrete meno difficoltà, in quanto avrete conoscenze approfondite di come agisce un programma; anzi, sono sicuro che non avrete nessuna difficoltà.

Come prima cosa vorrei spiegare che un buffer non è altro che un numero di bytes che vengono affidati ad una determinata variabile. Quindi una normale variabile, è flessibile, per quanto riguarda la memoria, invece una variabile dove è specificato un buffer, non è flessibile, cioè, ha un numero fisso di bytes in memoria. Da questo, è facile intuire genericamente di cosa andremo a parlare, cioè di un superamento del buffer. Un buffer, in C viene dichiarato per esempio così: "char buffer[25];" dove andremo a dichiarare una variabile che può contenere 25 caratteri (dallo 0 al 24).

Per capire effettivamente cos'è il buffer overflow, io fossi in voi, proverei a farmi un codice vulnerabile e exploitarlo, estrapolando le informazioni che otterrete qui, e magari in altri posti dove l'argomento è più approfondito.

Voglio spiegarvi questa tecnica, invitandovi, per prima cosa, a guardare l'immagine di questo post, perché rende molto l'idea. Chi ha un po di familiarità con i registri avrà notato due cose interessanti, cioè che EIP (registro sempre all'istruzione successiva a quella nella quale ci troviamo) ha un valore molto strano: "61616161" mentre ESP, che punta allo stack ci dice che ha un indirizzo "0012FCDC" e ha come valore "aaaa" o meglio "97979797". Questo è un chiaro caso di buffer overflow.
Probabilmente l'attacker in questione avrà rilevato un buffer di x caratteri, riempiendolo di caratteri "a"  e successivamente avrà messo, all'eccedere del buffer, altri 4 caratteri "a", che nella tabella ASCII è proprio 61h. Questo programma, così settato andrà sicuramente in segmentation fault visto che 61616161 non è un indirizzo presente in memoria, ma da questo si può arrivare ad una situazione di "Code Manipulation" andandosi bene ad informare sul base address (esempio: 00400000).

Per esempio, mettiamo che con Cheat engine, noto memory scanner,(che se leggete il PDF sulla creazione di hack che ho postato 2 settimane fa conoscerete abbastanza bene) troviamo una bella CALL ad una msgbox di avvenuta registrazione al programma, con un indirizzo di "00404961" per manipolare il codice, noi andremo a dare al programma vulnerabile un numero di "a" pari al buffer, seguite dai caratteri ASCII "0(1=" andando a sovrascrivere il registro EIP con appunto l'indirizzo 00404961. Bisogna però fare attenzione al fatto che non sempre il numero dei caratteri sono lo stesso numero del buffer, cioè, se dichiaro un buffer in C come quello di prima, non necessariamente potrò ottenere una code manipulation con 24 caratteri casuali + 4 mirati, perchè a volte bisogna mettere qualche carattere in più per riempire il buffer.

Per quanto riguarda la protezione da questa tecnica, quel che ci sarebbe da dire è ben spiegato QUA.

Nel caso ci fosse bisogno di qualche chiarimento, potete chiedetemi tramite e-mail (preferibilmente) oppure tramite commento.

2 commenti:

  1. http://pax.grsecurity.net/docs/aslr.txt

    RispondiElimina
  2. Interessante, ma è specifico su eseguibili
    Elf a quanto ho visto...

    RispondiElimina

Ti potrebbero anche interessare

Related Posts Plugin for WordPress, Blogger...