2016-04-15 12 views
5

Wie verschiebe ich meinen Stack zu einer bestimmten virtuellen Adresse? Zum Beispiel möchte ich, dass mein Stack 40960 groß ist und in der Adresse 0x355480 beginnt. Ich habe versucht, mit SetContext zu spielen, aber ich würde gerne wissen, ob es eine ‚Standard‘ Art und Weise, das zu tun:Stapel an bestimmten Ort verschieben

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

Sie können eine Funktion implementieren, dh switch_stack in Assembly und das Register esp mit Ihrem angegebenen Wert zuweisen. –

+0

Sie können einen vorhandenen Stapel nicht wirklich zufällig verschieben; Es kann absolute Zeiger geben, um Variablen überall zu stapeln. –

+0

aber ich kann es am Anfang des Programms tun, wenn nichts Wichtiges noch da ist. – JKS

Antwort

-2

-Code unten setzt den Stapelzeiger um die mmap wir zuvor und ermöglicht es uns, die Arbeit an es in main2 Funktion:

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

Damit dies eine gültige Antwort ist, muss es erklären, wie/warum es die Frage beantwortet. Wenn Sie die Manpage für 'setcontext (3)' lesen, benötigen Sie möglicherweise eine Compilersperre, um sicherzustellen, dass der Speicher tatsächlich vor dem Aufruf von 'setcontext' aktiviert wird. Obwohl wahrscheinlich nicht global, sondern statisch. –

Verwandte Themen