【发布时间】:2016-08-06 20:58:26
【问题描述】:
如何将我的堆栈移动到特定的虚拟地址?例如,我希望我的堆栈大小为 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);
}
【问题讨论】:
-
您可以在汇编中实现一个函数,即switch_stack,并为寄存器esp分配您指定的值。
-
您不能真正随机移动现有堆栈;到处都有指向堆栈变量的绝对指针。
-
但我可以在程序开始时执行此操作,此时还没有任何重要内容。
-
也许。但是你不能真正从这个函数return,只是
exit。 -
你说需要复制栈;它没有复制 - 但那是行不通的。您不能复制堆栈 - 您只能创建一个新堆栈。