Ottenere un'eccezione DEP quando si prova a chiamare SetProcessDEPException (false)

1

Sto dimostrando un exploit per una vecchia app.

On Windows XP SP3 32bit (EN) , l'indirizzo di SetProcessDEPPolicy() è in genere 0x7C8622A4 . Ho quella versione di Windows (anche in inglese) e ho creato con successo una catena ROP che mi porta esattamente a quel posto in memoria con il mio indirizzo di ritorno al mio shellcode e un 0 argomenti ordinatamente e correttamente seduti nello stack .

Ma quando provo a eseguire a quel punto ottengo debugged program was unable to process exception nel mio debbuger o in DEP exception quando si attiva l'exploit all'esterno del debugger.

Mi chiedo se potrebbe essere a causa del mio livello di patch (ho le patch più recenti). L'indirizzo di SetProcessDEPPolicy() è cambiato?

Come posso trovare manualmente l'indirizzo di tale funzione API?

Se l'indirizzo di SetProcessDEPPolicy() non è cambiato, perché ottengo un'eccezione?

Lo screenshot qui sotto mostra la situazione in cui ottengo l'eccezione, per quanto posso dire di avere tutto ciò che dovrebbe essere e dovrebbe essere in grado di disabilitare DEP invece di ottenere un errore. Sono presenti commenti sullo screenshot e puoi ottenere una risoluzione migliore facendo clic con il pulsante destro del mouse > visualizza l'immagine.

    
posta Juicy 26.01.2015 - 18:31
fonte

1 risposta

1

Le funzioni di ricerca sono disponibili in due versioni:

  1. Esportato - Super facile.

In Windows usa

HANDLE kernel32 = GetModuleHandle(L"kernel32");
FARPROC funcAddr = (FARPROC *) GetProcAddress(kernel32, "SetProcessDEPPolicy");

Questo restituirà l'indirizzo della funzione se è esportato dal modulo, in questo caso il modulo è kernel32.

  1. Non esportato - Fastidioso

Il primo passo è individuarlo manualmente attraverso una sorta di reverse engineering. Questo può essere difficile. Se si conoscono determinati tipi di errori costanti che potrebbero tornare, è possibile restringere la ricerca a una manciata di procedure. Windows ama utilizzare le costanti e ne documentano l'utilizzo in MSDN. Talvolta le funzioni non esportate sono documentate da altri ricercatori, o se sei abbastanza fortunato da farlo su un progetto open source, puoi cercare le costanti lì. Ma in realtà devi trovare la funzione attraverso il buon vecchio stile RE.

Puoi fare un ulteriore passo avanti per rendere questo più facile per te in futuro. Trova un flusso di byte univoco per la funzione. Quindi scrivi la tua funzione che può cercare una data immagine per quella sequenza unica e calcolare l'offset all'inizio della funzione. Boom hai un indirizzo.

Ovviamente l'uso di questa ricerca dinamica non è garantito dalla versione alla versione. Forse il compilatore ha avuto un'ottimizzazione diversa su SP1 rispetto a SP2? Il flusso univoco quindi non è più valido. Ma questa è davvero l'opzione migliore che hai per le funzioni non esportate.

    
risposta data 26.01.2015 - 19:26
fonte

Leggi altre domande sui tag