将堆栈移动到特定的位置

如何将我的堆栈移动到特定的虚拟地址? 例如,我想我的堆栈是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); } 

下面的代码设置了我们之前做过的mmap的堆栈指针,并允许我们在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()); } }