Do people simply put memory addresses into the stack (probably not)?
Sì, mettono in pila gli indirizzi di memoria da chiamare (richiamati dalle istruzioni ret) e lo spazio vuoto (da consumare dalle istruzioni pop sulla strada) e le variabili necessarie come argomenti per le funzioni chiamate tramite ret.
diciamo che hai un'applicazione vulnerabile, che consente l'aggressore
per sovrascrivere lo stack. Qualcosa come:
int function2(arg1,arg2){
char *buffer[10];
printf("Crash me now:\n");
return gets(buffer);
}
int main(int argv,char **args){
function2(arg1,args[0]);
}
- e hai DEP attivato che impedisce all'attaccante di inserire il
shellcode direttamente per impilarlo ed eseguirlo da lì
- sei all'interno di alcune funzioni vulnerabili come get
Questo è il tuo stack da ESP in poi, come quando ti trovi in funzione gets:
local_var1_of_gets
local_var2_of_gets
saved_EBP_of_function2
saved_return_to_function2
arg1_to_function2
arg2_tofunction2
local_buffer_of_function2
local_var2_of_function2
saved_EBP_of_main
saved_return_to_main
local_var1_of_main
local_var2_of_main
saved_EBP_of_entry0
saved_return_to_entry0
argv_to_function_main
args[0]_to_function_main
Quindi tu:
- scrive più caratteri poi allocati nel buffer in function2
- sovrascrive l'indirizzo "saved_return_to_main" con l'indirizzo al primo gadget
- come ottiene la funzione chiamerà "leave" (per far scoppiare l'EBP memorizzato - che dovrai indovinare quando si sovrascrive) e ret (per inserire l'indirizzo nel primo gadget e saltare ad esso)
- da lì sei da solo, quali gadget hai messo insieme
In realtà gli exploit di solito puntano al puntatore SEH (dato che è più facile colpire quello piuttosto che indovinare EBP) e andare da ROP da lì.
Why doesn't DEP prevent the calling of functions from a non-executable stack?
Perché ciò che hai messo in pila sono solo dati. Il codice effettivo da eseguire è nel segmento di testo, indicato solo come indirizzo per tornare dalla struttura dello stack quando si chiama l'istruzione "ret".
Eccellente dimostrazione di Stephen Sims / SANS SEC660
link