2016-04-15 16 views
5

Come spostare il mio stack su un indirizzo virtuale specifico? Ad esempio, mi piacerebbe che il mio stack fosse grande 40960 e iniziasse all'indirizzo 0x355480. Ho provato a giocare con setContext, ma mi piacerebbe sapere se c'è un modo 'standard' per farlo:Spostamento dello stack su un posto specifico

ucontext_t cont; 
bool flag = false; 
getcontext (&cont); 
if(!flag){ 
    void* a = mmap((void*)0x34B000, 81920, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
    cont.uc_mcontext.gregs[REG_ESP] = 0x355000; 
    flag = true; 
    setcontext(&cont); 
} 
+1

È possibile implementare una funzione, ad esempio switch_stack in assembly e assegnare il registro esp al valore specificato. –

+0

Non è possibile spostare una pila esistente a caso; ci possono essere indicatori assoluti per impilare le variabili ovunque. –

+0

ma posso farlo all'inizio del programma, quando non c'è ancora nulla di importante. – JKS

risposta

-2

codice sotto imposta il puntatore di stack intorno alla mmap abbiamo fatto prima e ci permette di lavorare su nella funzione main2:

bool flag = false; 
int argc2; 
char ** argv2; 
int main2(){ 
    ... 
} 
int main(int argc, char ** argv){ 
    argc2 = argc; 
    argv2 = argv; 
    ucontext_t cont; 
    getcontext (&cont); 
    if(!flag){ 
     void* a = mmap((void*)0x34B000, 81920, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
     if(a == MAP_FAILED){ 
     printf("mmapfail"); 
     return 1; 
     } 
     cont.uc_mcontext.gregs[REG_ESP] = 0x355000; 
     flag = true; 
     setcontext(&cont); 
    } else{ 
     exit(main2()); 
    } 
} 
+0

Perché questa sia una risposta valida, deve spiegare come/perché risponde alla domanda. Inoltre, leggendo la pagina man di 'setcontext (3)', potresti aver bisogno di una barriera per il compilatore per assicurarti che il negozio su 'flag' avvenga effettivamente prima della chiamata a' setcontext'. Anche se probabilmente non se è globale, piuttosto che statico. –