我想在用户空间程序中写一些东西,例如:将值3
从起始地址写入物理地址,而所有内核都在 0-240MB 范围内。我该怎么做?有什么想法吗?0xF7F4900(260MB)
0x0
此致。
我想使用 mmap 但我认为它可以让我获得虚拟地址。
memfd = open("/dev/mem", O_RDWR);
map = mmap(0xF7F4900, sizeof(int), PROT_WRITE, MAP_SHARED, memfd, 0);
*map = 3;
视为/dev/mem
文件并写入0xF7F4900
该文件中的偏移量:
char value = 3;
int fd = open("/dev/mem", O_RDWR);
lseek(fd, 0xF7F4900, SEEK_SET);
write(fd, &value, 1);
close(fd);
如果你愿意mmap
,同样的事情也适用。您不应尝试将其映射到0xF7F4900
您的进程中,而应将其映射到任意位置并写入,map[0xF7F4900]
如果您从偏移量 0map[0x900]
映射或从页面边界映射0xF7F4000
。
请注意,任意访问/dev/mem
可能需要特殊的内核配置,并且通过 UEFI 安全启动完全禁用。
这在大多数操作系统中是不可能的,因为您可以控制系统。数千个漏洞中的一个