【问题标题】:Is there any way by which a process P2 can access the local variable of another process P1?有什么方法可以让进程 P2 访问另一个进程 P1 的局部变量?
【发布时间】:2019-03-23 20:39:57
【问题描述】:

假设linux中有两个进程P1、P2(是病毒)。 P2 可以访问 P1 的本地变量(比如 x)吗?

在网上搜索,我发现由于进程中使用的地址是逻辑地址,所以P2无法访问P1的局部变量'x'。
但我想知道 P2 是否生成随机地址,其中一个解析为与“x”相同的物理地址,那么它不能访问它吗?

P2 真的可以访问 P1 的“x”吗?
如果是,如何? (如果可以通过任何技巧访问,请告诉我)
如果不能,为什么?

P1 代码:

int main() {
  int x = 20;
  return 0;
}

p2 代码:

int main() {
  /*
  generate random addresses and access them.
  one of them might resolve to physical address of 'x' in P1
  */
  return 0;
}

【问题讨论】:

  • 进程通常具有独立的内存——即使没有 ASLR。但是,有一些方法可以使用“共享内存”(提示:关键字)。
  • 为什么P2会生成随机地址?除非你问的是 P1 是否容易受到这种方式的攻击?
  • @Chipster “除非你问的是 P1 是否容易受到这种方式的攻击?” ==> 是的,我的意思是这个。
  • @user2864740 "但是,有一些方法可以使用“共享内存”" ==> 这是共享内存的合法方式。有什么方法可以在不使用任何合法的共享内存方式的情况下从 P2 访问“x”?
  • 喀布尔,细节取决于环境——以一些“游戏作弊”程序为例(“非恶意”)。在过去,这些主要基于内存修改。通常需要特殊的高度和支持/可行性各不相同。还有一些方法可以“挂钩”到正在运行的进程中,这样内存访问实际上就不会跨越进程边界。

标签: c++ memory-management process


【解决方案1】:

详细的机制取决于操作系统,但现代 CPU 架构使用virtual memory

  • 每个进程都有自己的virtual address space
  • 硬件组织虚拟地址和真实物理地址之间的映射。
  • 对未映射的虚拟地址的任何访问都会引发将被捕获的错误

因此,如果 P1 使用地址 0x200,并且如果 P2 知道该地址并决定使用它来注入一些东西,这将不起作用。因为一个进程的虚拟地址 0x200 与另一个地址的虚拟地址 0x200 不同。这些进程之间不共享地址(除了在操作系统地址空间中,并且受到很好的保护)。所以(原则上)P2 没有办法破坏 P1。

可以通过shared memorymemory mapped files 使用操作系统中的一些特殊功能来共享一些内存。但是两个进程需要合作才能共享内存。

最后,根据 P2 的权限,P2 可以请求操作系统访问 P1 的地址空间。 windows下是ReadProcessMemory()WriteProcessMemory()的API函数,linux下是访问物理内存对应的/dev/mem设备。但这些特权只授予由可信赖用户运行的可信赖进程。原则上普通用户的正常进程不应该有这些非常敏感的权限......所以你的 P1 应该是安全的。

【讨论】:

    【解决方案2】:

    linux 中的进程在保护模式下运行。这意味着一个进程有一个虚拟地址,而不是一个物理地址。

    问题的答案是肯定的,因为 linux 提供了写入和读取另一个进程的内存的方法。

    这可以通过写入和读取文件 /proc/%ld/mem 来完成,其中 %ld 是进程的 ID。

    如果您想了解更多信息,可以访问:https://nullprogram.com/blog/2016/09/03/

    【讨论】:

      【解决方案3】:

      C++ 语言中不存在进程的概念。 C++ 中没有标准的进程间通信方式。

      但是,操作系统提供了特定于平台的进程间通信 (IPC) 方式。一种广泛使用的 IPC 方法是网络套接字,它不仅可以用于同一系统内的进程之间的通信,还可以用于通过网络连接的不同系统上的进程之间的通信。

      【讨论】:

        猜你喜欢
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 2019-07-31
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多