【问题标题】:write hard-codded to RAM at specific physical-address将硬编码写入特定物理地址的 RAM
【发布时间】:2020-02-04 01:26:56
【问题描述】:

我想在用户空间程序中写一些东西,例如:从起始地址0x0开始在物理地址0xF7F4900(260MB)中写入值3,而所有内核都位于范围0内-240MB。 我该怎么做?请问有什么办法吗?

最好的问候。

我想使用 mmap,但我认为它可以让我获得虚拟地址。

memfd = open("/dev/mem", O_RDWR);
map = mmap(0xF7F4900, sizeof(int), PROT_WRITE, MAP_SHARED, memfd, 0);
*map = 3;

【问题讨论】:

  • *((int*)0xF7F4900) = 3; 工作吗?
  • @pmg 是的,但是这个地址是虚拟地址,不是吗?
  • @jww 好吧,假设我会这样做,我怎么知道值是写在物理地址中的?
  • 我不知道内核模式(或其他所谓的)内存访问是如何工作的

标签: c linux memory userspace


【解决方案1】:

/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](如果您从偏移量 0 映射)或 map[0x900](如果您映射)从页面边界0xF7F4000.

请注意,对/dev/mem 的任意访问可能需要特殊的内核配置,并且通过 UEFI 安全启动完全禁用。

【讨论】:

  • 不应该是write(fd, &value, sizeof value);吗? NVM,值是代码中的字符:O
  • 当我尝试时:int val = 5; lseek(fd, 0xF7F4900, SEEK_SET);写(fd,&val,sizeof(int)); write() 失败,错误为 bad_address :O 然后我们回到我的问题:如何将值写入 RAM 中的特定物理地址?谢谢
【解决方案2】:

这在大多数操作系统中是不可能的,因为您可以控制系统。 Only one of the thousands vulnerabilitys

【讨论】:

  • 关于 PHP 的链接在这里有什么帮助?
猜你喜欢
  • 2013-03-10
  • 1970-01-01
  • 2014-01-26
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多