5

我的代码中有这个片段

void jmp_esp()
{
    __asm__("jmp *%esp");
}

使用 gcc 编译时

gcc aslr.c -o aslr -ggdb -fno-stack-protector -z execstack

我得到这个错误。

aslr.c: Assembler messages:
aslr.c:6: Error: operand type mismatch for `jmp'

尽管汇编指令有效,为什么这一行无法编译?

我读过 DEP(数据执行保护)。会不会是这个功能造成了这个编译错误?如果是这样,如何禁用它?

4

1 回答 1

6

该指令jmp *%esp仅在 16 位和 32 位模式下可用。在 64 位模式下,jmp r/m32无法编码。根据您的意图,有两种方法可以修复您的代码:

  • 如果您的意图是编写 32 位 x86 程序,请编译并链接-m32以使编译器发出 32 位代码。
  • 如果您的意图是编写 64 位 x86 程序,请将指令更改jmp *%rsp为跳转到rsp寄存器中包含的地址。

请注意,这与 DEP 无关。DEP 阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是编译时。

于 2018-06-10T13:58:08.457 回答