我正在做一些逆向工程练习,我遇到了这个问题。一般的想法是让进程P1调用一个函数f1()。在f1()的开头,我让它睡觉,所以我们的邪恶过程P2可以启动。在P2中,我将f1()的堆栈上的返回地址覆盖到我们的邪恶函数fevil()。但是当f1()醒来时,它会在跳转到fevil()之前崩溃。
更多细节:
我正在使用一种没有任何内存保护的操作系统。每个进程都可以读/写 整个记忆范围。
整个事情都在x86架构上运行。
我这样做是在f1()的调用堆栈上找到返回地址,假设是0xffeecc,然后执行
*((int*) 0xffeecc) = fevil;
我正在使用gcc和各种标准C语言。
操作系统是单线程,除了主进程外,这两个进程是唯一运行的两个进程。
所以问题是为什么整个事情崩溃了,如果这是通过函数地址跳转到函数的正确方法。
我可以根据要求提供更多细节。谢谢。
答案 0 :(得分:0)
实际上你的编译器可能会实现一些内存保护:比如canaries针对缓冲区溢出/堆栈粉碎。
它在返回地址之前插入魔术字,并在跳转之前检查其完整性。 您可能已覆盖此标记。