C 将堆栈移动到特定位置

C 将堆栈移动到特定位置,c,linux,x86,stack,C,Linux,X86,Stack,如何将堆栈移动到特定的虚拟地址?例如,我希望我的堆栈是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

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

您可以实现一个功能,即在汇编中切换堆栈,并将指定的值分配给寄存器esp。您不能随意移动现有堆栈;到处都可以有指向堆栈变量的绝对指针。但我可以在程序开始时这样做,那时还没有什么重要的东西。也许。但是您不能真正从这个函数返回,只需退出即可;它没有复制,但这是不起作用的。你不能复制一个堆栈-你只能创建一个新的堆栈。为了使它成为一个有效的答案,它必须解释它如何/为什么回答这个问题。另外,在阅读
setcontext(3)
的手册页时,您可能需要一个编译器屏障,以确保在调用
setcontext
之前,存储到
标志实际发生。虽然如果它是全局的,而不是静态的,可能不会。