我希望在取出之前修改下一条指令,最好回答" How to modify return address on Stack in C or Assembly"在foo函数中,*p
指向main函数中的下一条指令。我想修改*p
指向的内容。例如,我想将下一条指令更改为跳转指令。我该怎么做?
void foo()
{
void** p = search((void**)&p, __builtin_return_address(0));
// modify content of where *p points at.
}
int main()
{
foo();
//next instruction. *p points here
return 0;
}
我想在intel Core-i7 3632QM处理器上使用gcc编译器。
答案 0 :(得分:3)
例如,我想将下一条指令更改为跳转指令。我该怎么做?
在具有现代操作系统的桌面系统上,除非正在执行的程序已经注意将代码保存在read-write memory pages中,否则不能。默认情况下,代码加载到只读存储器页面中。
答案 1 :(得分:2)
只是一个想法。正如在评论中已经提到的那样写和执行 [通常]不能在相同的内存范围上设置。但是任何POSIX系统都应该具有动态链接器(dlopen()
,dlclose()
,...)的接口。因此,有一种方法可以在运行时修改进程内存布局,动态链接器使用它。
如果修改动态链接器或使用相同的接口是可接受的选项,则可以转储内存段(或将其复制到另一个范围),修改,释放原始段并将修改后的段加载到相同的范围内