c - 通过在未初始化的数据段 (bss) 中打印 "garbage values",我们可以映射出

我有一个奇怪的问题,我不确定我是否能够解释它,但我们开始吧。在学习和使用 C 时,您通常会遇到术语“垃圾”或“垃圾”值,我的第一个问题是,该内存地址中的数据是否来自某个不同的程序或任何东西,或者它实际上是一些 '随机'值,如果我认为那个内存地址中的剩余值是真的,为什么我们仍然能够从这样的内存地址读取,我的意思是让我们假设我们只是声明 int x;它现在存储在 bss 中的某个内存地址 # 上,我们要输出它的值,我们将获得驻留在该地址上的值,所以如果我说的所有事情都是真的,那我们就不能声明很多许多变量但只声明而不初始化也许我们可以映射以前存储在 bss 中的所有值从之前的某个程序等。 我很可能确定这将是一个很大的安全威胁,因此我知道可能有一些措施可以防止这种情况发生,但我想知道是什么阻止了这种情况?

最佳答案

不,.bss 部分的内容在您的程序开始之前已清零。这是为了满足 C 对全局变量和 static 变量的保证,如果未明确初始化,将被初始化为零。

事实上,在典型的多任务系统上,您的进程分配的所有内存在您获得访问权限之前将被操作系统清零。这是为了避免您提到的安全漏洞。

如果未初始化,堆栈上的局部 (auto) 变量的值通常包含“垃圾”,但它会是您自己的程序执行到此为止遗留下来的垃圾观点。如果您的程序碰巧没有向堆栈上的特定位置写入任何内容,那么它仍将包含零(同样在典型的操作系统上);它永远不会包含来自其他程序的内存内容。

malloc 分配的内存也是如此。如果它直接来自操作系统,则它包含零。如果它恰好是之前分配和释放的 block ,它可能包含您之前使用该内存或 malloc 的内部数据产生的垃圾,但它永远不会包含另一个程序的数据。

关于c - 通过在未初始化的数据段 (bss) 中打印 "garbage values",我们可以映射出先前程序中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68705514/

相关文章:

python - 根据python中另一个字符串元素的数量删除字符串元素

bash - 引用命令替换的正确方法

string - 函数不想使用函数参数返回字符串切片

java - 使用同步(锁定对象) block 时,静态锁定对象是否需要是最终的?

css - 注入(inject)具有特定范围的 Chakra UI 全局样式

javascript - 如何使用 Axios 拦截器向响应添加一些 header ?

c# - 如何在控制台应用程序 .NET Core (C#) 中制作打开文件对话框?

reactjs - 如何在 onSubmit 事件中使用 react-query useQuery?

python - 从需要登录的社交媒体网站抓取最新帖子时,如何保持不被发现?

c++ - 使用 accumulate 计算替代总和