在jmp_buf中修改PC以转到另一个功能

时间:2010-01-24 16:54:37

标签: pthreads

对于用户杠杆线程库,我需要通过修改存储在jmp_buf中的PC值来找出跳转到函数。

这就是我写的:

jmp_buf env;

void print (void) {
 printf("\nHello World!");
}

 static int ptr_mangle(int p) {
        unsigned int ret;
        asm(" movl %1, %%eax;\n"
            " xorl %%gs:0x18, %%eax;"
            " roll $0x9, %%eax;"
            " movl %%eax, %0;"
        : "=r"(ret)
        : "r"(p)
        : "%eax"
        );
        return ret;
    }


int main() {
 int i = setjmp(env);
    env[0].__jmpbuf[5] = ptr_mangle(print);
 longjmp(env, 2);
    return 0;
}

我试图通过将其设置为我试图跳转到的函数的地址来修改jmp_buf中的PC。 我收到了分段错误。 我无法弄清楚究竟需要做什么。我是否还需要修改SP?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你想做什么?你没有检查setjmp的返回值吗?我不认为你这样做是正确的。看看下面的示例代码,看看输出是什么:

#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>

void subroutine(jmp_buf);

int main(void)
{
   int value;
   jmp_buf jumper;

   value = setjmp(jumper);
   if (value != 0)
   {
      printf("Longjmp with value %d\n", value);
      exit(value);
   }
   printf("About to call subroutine ... \n");
   subroutine(jumper);

   return 0;
}

void subroutine(jmp_buf jumper)
{
   longjmp(jumper,1);
}

输出将是: 即将调用子程序... Longjmp的值为1.

这引出了一个问题 - 为什么要尝试修改IP?这听起来像你覆盖了一些东西,或者代码“跳了出来”进入树林并踩踏了一些东西,然后硬着陆回来了,即段落错误。

变量env特别是一个结构,不要像你那样使用数组下标。我怀疑这就是你遇到段错误的原因......

希望这有帮助, 最好的祝福, 汤姆。