Programmazione orientata al ritorno: come trovare un pivot di stack

16

Ho un programma con un overflow di heap. Contiene un codice che non è casuale (non sta usando ASLR). Voglio fare un exploit di programmazione orientato al rendimento. Poiché si tratta di un overflow dell'heap, la prima cosa che devo fare è trovare un pivot dello stack, in modo da ottenere RSP che punta a un indirizzo di memoria noto in cui risiede il mio programma ROP.

Quali sono i modi all'avanguardia per trovare un pivot di stack? Quali sequenze di istruzioni dovrei cercare? Esiste un elenco / database di sequenze di istruzioni che possono essere utilizzate come pivot di stack?

Inoltre, ci sono delle difese / attenuazioni a cui devo prestare attenzione, o che potrebbero essere d'aiuto?

Ad esempio, penso di ricordare che le chiamate longjmp() sono un buon posto per trovare un pivot dello stack (ad es., una sequenza POP RSP ... RET), assumendo che io controlli un certo valore nello stack. Tuttavia, qualcuno mi ha detto che alcune piattaforme ora incorporano una mitigazione per rendere più difficile lo sfruttamento delle chiamate longjmp() : memorizzano i buffer setjmp in forma crittografata. È giusto, e ci sono dei modi per aggirare questa mitigazione, o dovrei rinunciare a longjmp() s?

Un'altra mitigazione è che la funzione VirtualProtect di Windows 8 controlla che venga chiamato con RSP impostato su qualcosa di ragionevole. Tuttavia, altri hanno documentato come bypassare tale mitigazione , quindi questo è non una barriera - e comunque, non è focalizzato sulla prevenzione del pivot iniziale dello stack. Il mio focus / interesse per questa domanda è sul pivot iniziale dello stack, non su quello che farai successivamente.

    
posta D.W. 25.10.2013 - 09:07
fonte

1 risposta

3

Dai un'occhiata a mona di corelan

link

    
risposta data 04.02.2014 - 02:06
fonte

Leggi altre domande sui tag