Несоответствие типов операндов при использовании "jmp *% esp" - PullRequest
0 голосов
/ 10 июня 2018

У меня есть этот фрагмент в моем коде

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 (предотвращение выполнения данных).Может быть, эта функция создает эту ошибку компиляции?если да, то как его отключить?

1 Ответ

0 голосов
/ 10 июня 2018

Инструкция jmp *%esp доступна только в 16- и 32-битном режимах.В 64-битном режиме кодирование jmp r/m32 невозможно.В зависимости от ваших намерений, есть два способа исправить ваш код:

  • , если вы намереваетесь написать 32-битную программу x86, скомпилируйте и свяжите с -m32, чтобы компилятор испустил 32битовый код.
  • если вы хотите написать 64-битную программу x86, измените инструкцию на jmp *%rsp, чтобы перейти к адресу, содержащемуся в регистре rsp.

Обратите внимание, что это не зависит от DEP.DEP предотвращает выполнение областей памяти, специально не помеченных как исполняемые.Это происходит во время выполнения, а не во время компиляции.

...