代码/软件如何访问内存中不应该访问的位置?

代码/软件如何访问内存中不应该访问的位置?

默认情况下,当应用程序运行时,它们可以访问的 RAM 数量是有限的,对吧?从技术上讲,我的 VLC 无法访问 Chrome 使用的内存地址。但操作系统/编译器怎么可能错误地允许访问代码不允许的地址。我知道很多“漏洞”和“有效载荷”利用了这一事实,创建占用过多空间并“溢出”到其他地址的变量,但这实际上是怎么发生的?

有些程序比其他程序更容易出现这种情况吗?它们用哪种语言编写有关系吗?例如,我知道 C 可以随意处理内存,而 Java 则不行。

另外,这样做有什么好处?如果有人编写了恶意代码来访问内存中的某个位置,他们会怎么做?我能想到的唯一方法就是将密码/密钥存储在 RAM 中。

附言我曾考虑过把这个问题放到 Stack Overflow 上,但我的问题比仅仅与编程角度相关要广泛得多。如果我把它放在了错误的地方,我很抱歉。

答案1

奇怪的是它确实涉及溢出 -堆栈溢出- 使用精心设计的进程来占用超出其应有的空间,以改变目标程序的行为或使其崩溃

答案2

需要特别指出的是:“溢出”通常不允许一个应用程序(进程)覆盖另一个应用程序(进程);相反,它们只是进程正在处理的数据,导致程序用这些数据覆盖自身的部分内容(通常是堆栈,也可能是间接的),然后允许接管这个过程

然后该进程可以通过正常的 IPC 和系统调用进行交互,接管您帐户可以访问的任何其他内容。VLC 无法使用普通地址访问 Chrome 的内存空间,但它能:

  • 假装是一个调试器,附加到Chrome进程,并对其进行修改。
  • 重写您的任何文件和帐户设置,以便其代码在您每次登录时运行。
  • 打开网络连接并将自身传播到其他机器。

不幸的是,除了偶尔的例外,现代操作系统都假设你完全信任你运行的每个程序,并信任你帐户中的所有内容。自从非网络分时系统(其中操作系统提供的保护措施仅供专家使用)问世以来,这一假设就不再成立保护用户彼此免受伤害,而不是来自他们自己的软件)。

相关内容