C 将堆栈移动到特定位置
如何将堆栈移动到特定的虚拟地址?例如,我希望我的堆栈是40960大,从地址0x355480开始。我尝试过使用setcontext,但我想知道是否有一种“标准”方法可以做到这一点: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
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
之前,存储到标志实际发生。虽然如果它是全局的,而不是静态的,可能不会。