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.