随机内存地址

Random memory address

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

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

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

首先,Glib (from GTK) is not GNU libc (a.k.a.glibc)

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

ASLR 主要由 Linux kernel (e.g. when handing mmap(2) without MAP_FIXED, as most implementations of malloc do, and probably also at execve(2) time for the initial stack). Changing your libc (e.g. to musl-libc) 提供,不会禁用它。

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

echo 0 > /proc/sys/kernel/randomize_va_space

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

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

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

 cat /proc/self/maps

此命令显示 address space (in virtual memory) of the process 运行 那个 cat 命令的文本表示。当你 运行 多次时,你会看到不同的输出!

对于调试 memory leaks, use valgrind. With a recent GCC 4.9 or better (or recent Clang/LLVM) compiler, the address sanitizer 也很有用,所以你可以用 gcc 编译,然后 -Wall -Wextra 得到所有的警告,甚至是额外的警告,然后 -g 得到调试信息,然后 -fsanitize=address