x86_64跳转到可写地址

时间:2019-05-29 03:39:11

标签: c assembly

我正在尝试在Linux上编写一个C程序,该程序会跳转到可由程序本身编写的位置。

#include <stdio.h>
int main(int argc, char* argv[]) {
    char a[] = {0x41, 0x5c, 0x41, 0x5d, 0x41, 0x5e, 0x41, 0x5f, 0x0};
    __asm__("pop %%r12;"
            "jmp *%[a];"
            "pop %%r11;" : : [a] "r" (a) : );
    return 0;
}

数组a包含指令pop %r12; pop %r13; pop %r14; pop %r15,我希望使用jmp指令跳转到数组a的地址并执行指令。

但是,该程序在执行时引发段错误。我用gcc来编译程序,用gdb来完成每条指令。我发现该程序成功跳转到数组a的地址,但是在执行第一条指令之前,它会收到信号SIGSEGV。

为什么会这样?这是否意味着我无法跳转到可写位置?这是硬件限制吗? (如果是这样,如何检查我的CPU是否支持这种跳转?)

我正在使用x86_64 CPU,并且程序以64位模式编译。

0 个答案:

没有答案