L'esecuzione di codice arbitrario è possibile usando la sovrascrittura GOT con W ^ X abilitato?

0

È possibile eseguire in modo affidabile codice arbitrario da una singola sovrascrittura della tabella offset globale quando W ^ X è abilitato? Con "in modo affidabile" intendo assumendo che controllo solo la posizione indicata dal puntatore dell'istruzione e possibilmente alcuni dati non eseguibili altrove.

Perché chiedo: utilizzando l'exploit dell'heap di House of Force demo qui , è possibile sovrascrivere la memoria arbitraria, il che rende il GOT un bersaglio attraente per il dirottamento del puntatore di istruzioni. Tuttavia, per rendere tale implementazione del lavoro di overflow dell'heap (ad esempio ottenere una shell), l'autore ha dovuto iniettare shellcode per puntare al GOT. Se W ^ X è abilitato, questa tecnica fallirebbe. Esiste un metodo (possibilmente facendo leva su ROP / JOP?) Che superi questa limitazione? Il motivo per cui sto avendo difficoltà con questo è perché in questo exploit si controlla solo il puntatore dell'istruzione, non il puntatore dello stack, quindi non riesco a vedere facilmente un modo per far funzionare ROP, e JOP sembra richiedere il controllo di più si registra per farlo funzionare (ma per essere onesto, implementare JOP mi è ancora in testa).

    
posta camercu 01.10.2017 - 00:24
fonte

2 risposte

0

È certamente possibile , dipende solo dalle circostanze. Come esempio di un attacco ret2libc, diciamo che il programma accetta l'input dell'utente in buffer e dopo aver sovrascritto una voce GOT, il programma ha una chiamata a strlen(buffer) in qualche punto dell'esecuzione. Ora se hai passato in '/ bin / sh' nel buffer e se hai sovrascritto la voce per strlen con l'indirizzo libc di system , quindi mentre effettui la chiamata a strlen , '/ bin / sh 'sarebbe opportunamente spinto allo stack come parametro a system e una shell verrebbe generata - con NX abilitato e senza avere un controllo esplicito sul puntatore dello stack.

Questo potrebbe sembrare un esempio forzato, ma si presenta abbastanza spesso e la differenza tra "possibile" e "impossibile" è spesso solo abilità ingegnosa come questa.

    
risposta data 15.10.2017 - 08:33
fonte
0

W ^ X impedisce semplicemente che le pagine siano contemporaneamente eseguibili e scrivibili, quindi una vulnerabilità di scrittura arbitraria non può modificare le pagine eseguibili. Non impone il controllo del flusso, quindi qualsiasi primitivo di exploit che consente un'esecuzione fuori ordine del codice esistente ha il potenziale per aggirarlo. Altri attacchi come Programmazione orientata al SigReturn, o SROP (su piattaforme che sono vulnerabili ad esso) e Programmazione ad Loop-Oriented, o LOP, sono spesso in grado di ottenere la stessa cosa.

Un esempio di exploit JOP può essere visto qui .

    
risposta data 15.10.2017 - 02:18
fonte

Leggi altre domande sui tag