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(数据执行预防)的文章.可能是这个功能正在创建这个编译错误?如果是的话,如何禁用它?
该指令jmp *%esp仅在16位和32位模式下可用.在64位模式下,jmp r/m32无法编码.根据您的意图,有两种方法可以修复您的代码:
-m32以使编译器发出32位代码.jmp *%rsp为跳转到rsp寄存器中包含的地址.请注意,这与DEP无关.DEP阻止执行未明确标记为可执行的内存区域.这在运行时发生,而不是在编译时发生.