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

han*_*bal 5 c assembly stack-pointer

我的代码中有这个代码段

void jmp_esp()
{
    __asm__("jmp *%esp");
}
Run Code Online (Sandbox Code Playgroud)

用gcc编译时

gcc aslr.c -o aslr -ggdb -fno-stack-protector -z execstack
Run Code Online (Sandbox Code Playgroud)

我收到这个错误.

aslr.c: Assembler messages:
aslr.c:6: Error: operand type mismatch for `jmp'
Run Code Online (Sandbox Code Playgroud)

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

我读过有关DEP(数据执行预防)的文章.可能是这个功能正在创建这个编译错误?如果是的话,如何禁用它?

fuz*_*fuz 6

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

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

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