c++ - 有没有办法找出我的操作系统在我的 RAM 中的位置?
问题描述
我想知道 C 或 C++ 是否有办法找到操作系统在 RAM 中的运行位置并释放该位置。我知道我可以使用 free() 来释放内存位置。我想知道是否可以通过释放操作系统的 RAM 空间来关闭计算机。
解决方案
在受保护的内存成为事物之前,您可以使用其物理地址访问任何内存并对其进行操作。这就是 DOS 和基于 DOS 的 Windows(Windows 95 之前,如 3.1)的工作方式。
受保护的内存或虚拟化内存意味着您可以执行诸如将部分内存交换到磁盘之类的操作,实际上是假装拥有比计算机实际拥有的更多的内存。内存块可以根据需要进行交换、调入和调出,而正在运行的程序并不明智。这些地址都是虚拟的,或者“假的”,因为它们实际上并不存在,但就 CPU 而言,它们是真实的,并且完全按照您的预期工作,这是通过集成内存管理单元(MMU)完成的在 CPU 中。
在受保护的内存之后,您的“用户空间”程序不再看到物理内存地址,而是操作系统本身管理的虚拟地址。在 Intel 类型的系统上,操作系统的核心内核在一个特殊的保护环内运行,该保护环可防止用户程序直接访问或操作内存。
任何多用户系统都必须实现这种内存和内核保护,否则将无法阻止一个用户访问另一个用户进程的内存。
在内核中没有传统意义上的“malloc”或“free”,内核有自己特殊的分配机制。malloc()
这些与 C 标准库中的传统和函数完全分开,free()
并且在任何方面都不兼容。每个内核,无论是 Linux、BSD 还是 Windows 或其他内核,都以不同的方式执行此操作,即使它们都可以支持使用完全相同malloc()
功能的用户空间代码。
您应该无法通过简单的内存分配调用使系统崩溃。如果可以,恭喜,您发现了一个漏洞,应该记录它并将其转发给适当的各方以进行进一步分析。请记住,这种事情经过大量研究,因此您偶然发现的可能性非常低。像pwn2own这样的比赛展示了绕过所有这些安全性所涉及的工作量。
同样重要的是要记住操作系统不一定位于固定位置。地址空间布局随机化是一种对各种函数和数据的地址进行打乱的技术,以确保漏洞利用不能使用硬编码值。在这很常见之前,您可以预测各种事物将存在于内存中的位置并通过一个小错误进行盲目操作,但现在这变得更加困难,因为您不仅必须找到一个可以操纵的漏洞,而且还要找到另一个首先发现地址的漏洞.
话虽如此,C 或 C++ 在“能力”方面并没有什么特别之处,这使得它能够做其他语言无法做到的事情。任何能够与操作系统功能绑定的程序在控制方面都具有相同的等效“权力”。这包括 Python、Perl、Ruby、Node.js、C# 以及其他可以绑定到 C 库并进行任意函数调用的长长的列表。
人们用最方便的任何语言对“漏洞利用”进行原型设计,通常是 Perl 或 Python,就像 C 一样。这真的取决于你想要完成什么。有些错误一旦被发现,很容易重现,您可以使用浏览器 JavaScript 之类的普通代码来重现,就像Row Hammer一样。
推荐阅读
- java - 如何通过在同一个父项中搜索子项的其他值来检索子项的值
- python - 没有名为 selenium.webdriver.common.action_chains 的模块
- javascript - Javascript - 识别正 0 和负 0 数字
- hdfs - Flume sink to HDFS 错误:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
- python - Pandas:如何在 python 字典中搜索和删除键值对以匹配模式
- amazon-web-services - CannotPullContainerError:启动 ECS 任务时出现上下文取消错误
- docker - docker zeppelin 上的 docker spark?
- flutter - 在 Dart 上使用异步方法
- python - 强制 Anaconda 安装 tensorflow 1.14
- ios - 我应该如何让浮动按钮只存在特定的 ViewController?