Изменить счетчик программ (ПК) на сохраненный адрес
Я работаю над программой, которая использует встроенную сборку для выполнения прыжка в длину. Насколько я понимаю, все, что мне нужно сделать, это заменить 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
Вы не можете изменять ПК напрямую с помощью инструкции, потому что она всегда там, где находится текущая инструкция. Тем не менее, вы должны знать, что это может привести к утечкам памяти или другим побочным эффектам, поскольку стек может быть обработан неправильно.