Изменить счетчик программ (ПК) на сохраненный адрес

Я работаю над программой, которая использует встроенную сборку для выполнения прыжка в длину. Насколько я понимаю, все, что мне нужно сделать, это заменить FP и ПК на сохраненные FP и ПК. Используя сборку, я могу изменить указатель кадра (%ebp), но не могу сделать это на ПК.

int jump(int x)
{
  int oldFP = getebp();  //the FP of the calling function
  int oldPC = getebp()+4;  //the PC of the calling function

  ljump();  //uses assembly to change FP (works) but can't figure out PC

  return x;
}

и мой ljump() является

ljump: # return stack frame pointer FP 
       movl  savedFP, %ebp
       ret

моя предыдущая попытка сменить компьютер была с использованием скачка, однако я обычно получаю ошибку сегментации.

Любой вклад будет оценен.

1 ответ

Если вы хотите, чтобы ваш код продолжал работать по какому-то предопределенному адресу, вы можете сделать это следующим образом в своем asm-коде (псевдокод):

push myNewAddress
ret

или, если вы предпочитаете это по-другому, используя регистр:

mov  eax, myNewAddress
jmp eax

Вы не можете изменять ПК напрямую с помощью инструкции, потому что она всегда там, где находится текущая инструкция. Тем не менее, вы должны знать, что это может привести к утечкам памяти или другим побочным эффектам, поскольку стек может быть обработан неправильно.

Другие вопросы по тегам