c - 将堆栈移动到特定位置

标签 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 | 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());
    }
}

关于c - 将堆栈移动到特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36637784/

相关文章:

assembly - 将 2 个像素点在一起

c - 使用 D-Bus 发送消息

c++ - 将 float 截断为前 N 个十进制数字

c - 根据匹配数据删除节点

linux - 向 Grub2 添加命令

c - stat.h 在 Linux 中不可用?

performance - 在最近的 Intel x86 上,端口 7 可以存储 AGU 处理什么类型的地址?

c++ - 热衷于不依赖 GNU Make 的依赖项的原子创建?

linux - 为什么 echo 从不打印

汇编,将单个字节从寄存器写入内存会覆盖其他字节