使用 "jmp *%esp" 时操作数类型不匹配

Operand type mismatch when using "jmp *%esp"

我的代码中有这个片段

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(数据执行保护)的内容。可能是此功能导致此编译错误吗?如果是这样,如何禁用它?

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

  • 如果您打算编写 32 位 x86 程序,请使用 -m32 编译并 link 以使编译器生成 32 位代码。
  • 如果您打算编写 64 位 x86 程序,请将指令更改为 jmp *%rsp 以跳转到 rsp 寄存器中包含的地址。

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