使用 "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 阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是编译时。
我的代码中有这个片段
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 阻止执行未明确标记为可执行的内存区域。这发生在运行时,而不是编译时。