2016-04-15 11 views
5

スタックを特定の仮想アドレスに移動するにはどうすればよいですか?たとえば、スタックが40960大きく、アドレス0x355480から始まるようにしたいと思います。私はsetcontextで遊んでみましたが、私はそれを行うための「標準的な」方法があるかどうかを知りたいのです:スタックを特定の場所に移動する

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

あなたは、アセンブリ内の関数すなわちswitch_stackを実装して、指定した値とESPレジスタを割り当てることができます。 –

+0

既存のスタックを実際にランダムに移動することはできません。どこでもスタック変数への絶対ポインタが存在する可能性があります。 –

+0

しかし、私はプログラムの初めにそれを行うことができます、何も重要なことはまだありません。 – JKS

答えて

-2

コードは以下の我々は前にやったのmmap周りのスタックポインタを設定し、私たちが作業することができますメイン2機能で、それは:

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

これが有効な答えであるためには、それがどのように/なぜそれに答えているのかを説明しなければなりません。また、 'setcontext(3)'のmanページを読むことから、 'setcontext'を呼び出す前に' flag'へのストアが実際に起こることを確かめるために、コンパイラのバリアが必要になるかもしれません。おそらくグローバルではなく、静的ではないでしょう。 –

関連する問題