对于用户杠杆线程库,我需要通过修改存储在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?
非常感谢任何帮助。
答案 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
特别是一个结构,不要像你那样使用数组下标。我怀疑这就是你遇到段错误的原因......
希望这有帮助, 最好的祝福, 汤姆。