【问题标题】:Random memory address随机内存地址
【发布时间】:2015-05-22 06:37:49
【问题描述】:

我正在使用 EGLIBC 2.13 在 Debian 下使用虚拟机来学习内存地址。 所以我写了一个简单的代码给我一个测试变量的地址,但是每次我执行这个脚本,我得到一个完全不同的地址。

这是来自 2 个不同执行的两个屏幕:

这是什么原因造成的?我正在使用 VM 或我的 GLIBC 版本的事实? 我想这是防止缓冲区溢出的 GLIBC,但我在网上找不到我的答案。 它是完全随机的吗?

【问题讨论】:

  • 顺便说一句,您可以在虚拟机中使用 Debian 测试(或 Linux Mint)进行开发。

标签: memory glibc


【解决方案1】:

首先,Glib(来自 GTK)不是 GNU libc(又名glibc

然后,您正在观察ASLR(地址空间布局随机化)的效果。不要尝试在直接连接到 Internet 的服务器上禁用它,这是一种有价值的安全措施。

ASLR 主要由Linux kernel 提供(例如,当处理mmap(2) 没有 MAP_FIXED,就像malloc 的大多数实现一样,并且可能也在execve(2) 时间初始堆栈)。更改您的 libc(例如更改为 musl-libc)不会禁用它。

您可以使用proc(5) 在笔记本电脑(或在某些 VM 中运行的 Linux 系统)上禁用系统范围的 ASLR:运行

echo 0 > /proc/sys/kernel/randomize_va_space

作为根。请注意,这样做会降低系统的安全性。

我不知道你怎么称呼完全随机,但 ASLR 足够随机。 IIRC,(但我可能错了)64 位地址的中间 32 位(假设是 64 位 Linux 系统)是相当随机的,以至于产生了 mmap 的结果(因此 malloc 使用它)几乎不可预测且不可重现。

顺便说一句,要在实践中查看 ASLR,请尝试多次(启用 ASLR)以下命令

 cat /proc/self/maps

此命令显示运行该cat 命令的processaddress space(在virtual memory 中)的文本表示。多次运行会看到不同的输出!

要调试memory leaks,请使用valgrind。使用 recent GCC 4.9 或更高版本(或 recent Clang/LLVM)编译器,address sanitizer 也很有用,因此您可以使用 gcc 然后 @ 987654348@ 获取所有警告,甚至是额外的警告,然后-g 获取调试信息,然后-fsanitize=address

【讨论】:

  • 好吧,这不是我想的两种可能性,完美! :) 不,我不会停用它,别担心。我猜攻击者一定很难用它来猜测内存地址!
  • 我不担心。在实践中,当使用 gdb 调试 C(甚至 C++)中的低级内存问题时,我会禁用 ASLR 以获得更多可重现的运行。
  • 感谢您提供大量信息和链接,我会全部检查。但这意味着 ASLR 不能在 MacOS 和 Windows 上运行?
  • 根据 Wikipedia,recent MacOSX 和 Windows 都有 ASLR。但我不知道,我不使用 MacOSX 或 Windows(自 1974 年开始编码时,我几乎从未使用过它们)。
  • ASLR 自 Windows Server 2008 和 Vista for Microsoft 以及 MacOS 10.5 (Léopard) 开始实施。这很让人放心。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2013-05-11
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2017-10-02
相关资源
最近更新 更多