我如何覆盖内核函数的返回地址?

时间:2017-02-28 21:50:30

标签: x86 stack overwrite

我有一个正在运行的进程调用sleep(),我想覆盖sleep()的返回地址,这样当它返回时它将执行我的代码。执行覆盖的过程接下来运行,没有保护或隔离。存储的返回地址在哪里以及如何更改它,可能是asm?

1 个答案:

答案 0 :(得分:0)

您不能在x86架构中从用户模式覆盖内核函数的返回地址 - 处理器在执行使用它的特权控制传输时切换堆栈。
根据{{​​3}},地址甚至可能不在堆栈中。

像往常一样,mechanism used to enter the kernel-mode中的所有细节。

也就是说,大多数用户模式函数都是系统调用的包装器 - 所以它们还不是内核函数,因此你可以“简单地”毒化堆栈上的返回地址以控制控制流你请(la Intel Software Developer's Manual 3) 假设你的挂钩代码有机会在钩子函数返回之前执行。

然而,流程是孤立的,我不知道你的意思

  

执行覆盖的过程接下来运行,没有任何保护或隔离。

但无论如何都需要在挂钩过程中使用有效负载。

根据您在第一时间放置有效负载的方式,可能更容易将对目标函数的调用更改为调用您的过程的调用,该过程调用原始函数以及执行有效负载(而不是处理像堆栈这样的瞬态结构 最后一行,如果您要修补可执行文件以在其代码部分中放置有效负载,也可以修补该调用。

如果你未说明的意图是劫持导入/动态链接的函数,那么它本身就需要一个特定的问题,其背景比你在这里提供的更好。