C覆盖函数的返回地址导致内核崩溃

时间:2014-02-12 02:24:30

标签: c

我正在做一些逆向工程练习,我遇到了这个问题。一般的想法是让进程P1调用一个函数f1()。在f1()的开头,我让它睡觉,所以我们的邪恶过程P2可以启动。在P2中,我将f1()的堆栈上的返回地址覆盖到我们的邪恶函数fevil()。但是当f1()醒来时,它会在跳转到fevil()之前崩溃。

更多细节:

  1. 我正在使用一种没有任何内存保护的操作系统。每个进程都可以读/写 整个记忆范围。

  2. 整个事情都在x86架构上运行。

  3. 我这样做是在f1()的调用堆栈上找到返回地址,假设是0xffeecc,然后执行

    *((int*) 0xffeecc) = fevil;

  4. 我正在使用gcc和各种标准C语言。

  5. 操作系统是单线程,除了主进程外,这两个进程是唯一运行的两个进程。

  6. 所以问题是为什么整个事情崩溃了,如果这是通过函数地址跳转到函数的正确方法。

    我可以根据要求提供更多细节。谢谢。

1 个答案:

答案 0 :(得分:0)

实际上你的编译器可能会实现一些内存保护:比如canaries针对缓冲区溢出/堆栈粉碎。

它在返回地址之前插入魔术字,并在跳转之前检查其完整性。 您可能已覆盖此标记。