gpt4 book ai didi

将函数从用户空间复制到内核并执行

转载 作者:IT王子 更新时间:2023-10-29 01:13:06 26 4
gpt4 key购买 nike

首先,我这样做是为了好玩所以不要评判我。

我所做的是将函数指针从用户空间传递到内核,使用 copy_from_user 将函数体复制到内核中的静态数组,然后开始跳转到该数组中执行。

在内核中:

static char handler_text[PAGE_SIZE] __page_aligned_data;
copy_from_user((void *)handler_text , (const void __user *)my_handler , PAGE_SIZE);
((void (*)())(handler_text))();

在用户空间,这个函数做的事情很简单如下

void my_handler(){
volatile unsigned long * p = (volatile unsigned long *)0xF0000c10;
*p = 0x0000000;
}

10000938 <my_handler>:
10000938: 3d 20 f0 00 lis r9,-4096
1000093c: 39 40 00 00 li r10,0
10000940: 61 29 0c 10 ori r9,r9,3088
10000944: 91 49 00 00 stw r10,0(r9)
10000948: 4e 80 00 20 blr
1000094c: 00 01 88 08 .long 0x18808

问题是我第一次这样做时总是会产生糟糕的消息。但是我第二次这样做和之后,问题就消失了,再也没有Oops了。我可以通过读取内存清楚地看到该函数是由内核执行的。我正在运行一个 PowerPc 目标,所以 Oops 显示异常是 700,这是程序异常。从 Oops 中,我可以看到指令转储,其中 nip(之后)与 my_handler 完全相同。

Instruction dump:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 <3d20f000> 39400000 61290c10 91490000

我想不出有什么意义。任何人都可以吗?谢谢

最佳答案

我不想打消一个令人钦佩的想法,但如果没有一些严肃的额外工作,你想要做的事情即使不是不可能也是困难的。

您的函数链接在 用户 空间中的 F 位置。您正在将它复制到静态数组位置的内核空间:AA 可能位于内核的数据部分,因此可能无法执行。此外,您的函数链接到错误位置(例如 F != A)。

此外,即使您的函数可以链接到正确的位置 A,您如何处理其中符号的重定位(例如,如果它调用 printk,如何您重新链接函数内的地址以匹配实际的 printk 地址)?

创建内核模块并加载它(通过 modprobe)要容易得多,您可以做任何您想做的事。

旁注:这是一个巨大安全漏洞。 “Stuxnet”蠕虫使用类似的一个来渗透 Windows。


更新:

转储发生在异常事件发生后 [及时] 很长时间。到那个时候,它有正确的数据,所以转储显示当前状态,可以这么说,但不是在有问题的确切周期发生了什么[由于这种“自修改”代码的性质]。

但是,当最初执行时,它可能有垃圾(即 700)。我不确定 PPC,但其他拱门有单独的 inst 和数据缓存。乱序执行。数据将在数据缓存中,但不一定在 inst 缓存 [或队列] 中。而且,它们倾向于独立运行以提高速度 [“哈佛”架构]。

(例如)在 x86 上,设置静态区域后,您必须刷新/同步以便执行单元重新获取该区域。否则,它可能已经推测性地预取了指令数据(例如,它不期望它是“自修改的”),其中的数据不是预期的[可能是 0x00000000]。

考虑:在 copy_from_user 之后,所需的数据位于数据缓存中,但尚未被刷新到 RAM。执行单元[和 inst 缓存],没有来自静态区域的任何数据,将从 RAM 中获取。因为自修改代码很少见,所以 inst 和数据缓存不会互相窥探[这会减慢速度]。

因此,执行单元从 RAM(例如 0x00000000)而不是加载的数据[数据缓存中]获取数据。

第二次成功是因为执行单元获取的数据来自第一次尝试时的数据[有时间刷新到RAM]。也就是说,静态区域现已填充,第二个 copy_from_user 实际上是一个 NOP。

[如前所述]该区域的“验尸”转储将无法显示这种差异。

关于将函数从用户空间复制到内核并执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com