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

X86 如何覆盖内核函数的返回地址?,x86,stack,overwrite,X86,Stack,Overwrite,我有一个调用sleep()的进程正在运行,我想覆盖sleep()的返回地址,这样当它返回时,它将执行我的代码。接下来执行覆盖的进程将在没有保护或隔离的情况下运行。返回地址存储在哪里?我将如何更改它,可能使用asm?在x86体系结构中,您不能从用户模式覆盖内核函数的返回地址-在执行使用它的特权间控制传输时,处理器会切换堆栈。 而且,地址可能甚至不在堆栈上,这取决于地址的大小 像往常一样,所有的细节都在报告中 这就是说,大多数用户模式函数都是围绕系统调用的包装器——因此它们还不是内核函数,因此您可

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

在x86体系结构中,您不能从用户模式覆盖内核函数的返回地址-在执行使用它的特权间控制传输时,处理器会切换堆栈。
而且,地址可能甚至不在堆栈上,这取决于地址的大小

像往常一样,所有的细节都在报告中


这就是说,大多数用户模式函数都是围绕系统调用的包装器——因此它们还不是内核函数,因此您可以“简单地”毒害堆栈上的返回地址,以随心所欲地控制控制流(a la)。
假定挂钩代码在挂钩函数返回之前有机会执行

不管过程是孤立的,我不知道你说的是什么意思

接下来执行覆盖的进程将在没有保护或隔离的情况下运行

但无论如何,您都需要在挂接过程中使用有效负载

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


如果您未声明的意图是劫持导入的/动态链接的函数,则该函数本身会调用特定的问题,其上下文比您在此处提供的上下文更好。

返回地址通常存储在堆栈上的哪里。问题不在于如何覆盖它,而在于如何找到它所在的位置以及如何到达那里(操作系统不允许您访问内存)。如果您使用优化进行编译,并且您的
sleep
函数是内联的,会发生什么情况?