【问题标题】:Moving stack to specific place将堆栈移动到特定位置
【发布时间】: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
  • 你说需要复制栈;它没有复制 - 但那是行不通的。您不能复制堆栈 - 您只能创建一个新堆栈。

标签: c linux x86 stack


【解决方案1】:

下面的代码围绕我们之前所做的 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());
    }
}

【讨论】:

  • 要成为一个有效的答案,它必须解释它如何/为什么回答这个问题。此外,通过阅读setcontext(3) 的手册页,您可能需要一个编译器屏障来确保存储到flag 实际发生在调用setcontext 之前。虽然如果它是全局的而不是静态的,则可能不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多