Инструкция JMP - шестнадцатеричный код

У вас есть сомнения относительно преобразования шестнадцатеричного кода машинной инструкции JMP. У меня есть абсолютный адрес, на который я хочу перейти, скажем, "JMP 0x400835". Прежде всего, разрешено ли это? Если да, каков будет соответствующий шестнадцатеричный код? Если нет, могу ли я сначала сохранить адрес в каком-то регистре, скажем EAX, а затем поставить "JMP EAX"? Я работаю над архитектурой x86 (64b).

Я попытался распечатать шестнадцатеричный код из вывода diassem в gdb, но нет согласованности, т.е. я не вижу адрес назначения в шестнадцатеричном коде.

Я новичок в шестнадцатеричном коде и машинных инструкциях, поэтому помилуй свое невежество.

Ответ 1

Нет никакого перехода формы JMP absaddr к абсолютному адресу в режиме 64 бит. Операнд прыжка всегда представляет собой 32-битное относительное смещение на rip, которое получает знак, расширенный до 64 бит.

Причина, по которой вы не видите согласованности, возможно, что смещение зависит от текущего указателя инструкции, и вы этого не узнали.

jmp eax также не допускается, так как адреса, конечно, всегда 64-битные в ширину в 64-битной архитектуре. Возможна последовательность mov rax, addr + jmp rax, она будет выглядеть как

48 c7 c0 35 08 40 00            mov rax, 0x00400835
ff e0                           jmp rax

или

48 b8 35 08 40 00 00 00 00 00   mov rax, 0x0000000000400835
ff e0                           jmp rax

Как я узнал эти шестнадцатеричные коды? Ну, я спросил своего компилятора. Я скомпилирован с gcc -c и разобрался с objdump. Я не стал использовать синтаксис Intel, потому что мне это не нужно. Так что это синтаксис AT & T.

echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c
gcc -c test.c
objdump -d test.o

Ответ 2

Если вы не хотите использовать регистр по какой-либо причине, также возможно закодировать 64-битный абсолютный немедленный переход как

ff 25 00 00 00 00           jmp qword ptr [rip]
yo ur ad dr re ss he re     some random assembly

rip ссылается на указатель инструкций ПОСЛЕ самой инструкции jmp, поэтому это указатель на ваш адрес.