Come funziona il ROP?

2

So che ROP funziona usando le funzioni in memoria. So che una catena ROP utilizza "gadget" che eseguono piccoli frammenti di codice e torna allo stack, eseguendo il prossimo gadget. Quindi la mia domanda è: come viene modificato lo stack per farlo? Le persone semplicemente mettono gli indirizzi di memoria nello stack (probabilmente no)? Utilizza funzioni come call <mem addr> o ret <mem addr> ? Perché il DEP non impedisce la chiamata di funzioni da uno stack non eseguibile?

    
posta Simon L. 19.10.2016 - 23:23
fonte

1 risposta

4

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

    
risposta data 20.10.2016 - 06:35
fonte

Leggi altre domande sui tag