AMD64 overflow e null byte

11

In passato, sono riuscito a sovraccaricare i miei programmi vulnerabili e quelli degli altri, ma solo sempre in un ambiente a 32 bit. Ogni volta che provo anche un semplice stack su una macchina a 64 bit, mi imbatto in problemi. Un indirizzo che sto cercando di scrivere contiene sempre byte null.

Un semplice esempio di un problema di ieri; Stavo cercando di sovrascrivere il GOT per causare una chiamata successiva a printf() per diventare una chiamata a system() Avevo tutti gli indirizzi di cui avevo bisogno (ASLR off, DEP on).

Mi sono bloccato quando ho provato a sovrascrivere un puntatore a pila (alto indirizzo di memoria) con un valore heapland (basso indirizzo di memoria).

0x7fffffff_ff480a90 -> 0x00000000_0068a9a0

Il mio overflow è terminato con \xa0\xa9\x68 , che con il terminatore null ha lasciato il puntatore simile;

0x7fffffff_0068a9a0

Il che non andava bene, l'ho guardato per ore e non riuscivo a capire come aggirarlo. Come dire che ho incontrato questo problema con byte null molte volte. Ho sempre pensato che fosse solo una di quelle cose, ma sembra rendere completamente impossibile l'hacking di un sistema a 64 bit, dato che gli indirizzi contengono spesso byte null.

Sono solo sfortunato? Mi manca qualcosa di ovvio? Non ho sentito nessuno parlare di questo problema in termini di 32 vs 64.

    
posta lynks 15.08.2012 - 13:01
fonte

2 risposte

3

In primo luogo, c'è qualcosa di strano nel tuo esempio. I processori attuali che implementano la modalità amd64 (aka x86_64 aka x64 ovvero un gruppo di altri nomi) non utilizzare i 64 bit completi dei registri degli indirizzi. Usano gli indirizzi a 48 bit e rendono obbligatorio che i bit da 48 a 63 siano identici (come se fosse "estensione di segno"). Pertanto, un indirizzo come 7fffffff_ff480a90 non sarà accettato da nessuna CPU attualmente prodotta. Più probabilmente, hai 00007fff_ff480a90 . Questo riduce il tuo problema a due byte invece di quattro.

Un metodo generico consiste nell'eseguire diversi overflow successivi; a seconda delle esatte condizioni con cui è possibile eseguire il trabocco dei dati, questo potrebbe essere possibile o meno. Con diversi overflow, sostituisci lo slot di destinazione con 00000054_54545454 , poi 00000000_54545454 e infine 00000000_0068a9a0 . Ogni overflow consente di scrivere un singolo byte null terminante, si desidera scrivere tre byte null, quindi tre overflow.

    
risposta data 25.03.2013 - 16:20
fonte
4

Potresti voler leggere questo link

Essenzialmente x86 e x64 sono diversi nel modo in cui funzionano. Il nuovo ABI descrive i nuovi modi in cui funziona con le chiamate Leaf e Non Leaf, la gestione delle eccezioni e lo srotolamento.

Dato che lo scopo è essenzialmente di traboccare - devi capire il nuovo ABI come funziona e dove è ora come in posti leggermente diversi per essere in grado di "inserire" e "alterare".

    
risposta data 24.08.2012 - 10:47
fonte

Leggi altre domande sui tag