Подтвердить что ты не робот

Замены для инструкции "call" для сборки x86?

Каковы некоторые альтернативы инструкции по вызову x86? Может быть, что-то вроде толчка обратного адреса, а затем прыжок?

Также их команда для получения текущей позиции в памяти?

4b9b3361

Ответ 1

CALL действительно делает это для вас, например

CALL my_func

сделает что-то вроде

push ret_address
jmp my_func

и последующий вызов RET будет просто использовать адрес, который вы просто нажали на JMP в некотором смысле. Есть ли конкретная причина, по которой вы не хотите использовать CALL или она недоступна для вас? Для текущей позиции в памяти вы можете попробовать прочитать регистр EIP (не можете писать на него).

Ответ 2

Вы можете просто нажать значение dword и jmp для процедуры. Точкой будет адрес возврата:

push return_address (push eax if address in eax)
jmp call_address

Не забудьте также нажать аргументы, если они существуют для этого конкретного вызова.

Что вы подразумеваете под текущей позицией в памяти? Я предполагаю, что вы имеете в виду текущий указатель инструкции. Вы не можете получить это напрямую, но вы можете использовать обработчик seh (структурированный обработчик исключений), чтобы получить это значение при вызове обработанного исключения.

Ответ 3

Если я не получу что-то смешное, я бы сказал, это зависит. Как вы можете видеть здесь есть ближние и дальние звонки, но давайте просто рассмотрим ближний звонок. Есть еще две возможности

E8 <offset> # relative
FF <address> # absolute

тогда как FF означает абсолютный "прыжок" и E8 действительно означает относительный ток eip.

Итак, если у вас есть, например,

E8 32 45 ab 6f

что означает

call 0x3245ab6f

Это переведет на

push %eip
add $0x3245ab6f, %eip

а не

push %eip
jmp $0x3245ab6f