随机内存地址

时间:2015-03-19 08:09:51

标签: memory glibc

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

这是两个区别执行的两个屏幕:

enter image description here

enter image description here

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

1 个答案:

答案 0 :(得分:2)

首先,Glib(来自GTK)不是GNU libc(a.k.a。glibc

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

ASLR主要由Linux kernel提供(例如,在没有 MAP_FIXED处理mmap(2) 时,正如malloc的大部分实现所做的那样,可能也是在初始堆栈的execve(2)时间。更改libc(例如更改为musl-libc)不会禁用它。

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

echo 0 > /proc/sys/kernel/randomize_va_space

以root身份。小心,这样做会降低系统的安全性。

我不知道你所谓的完全随机,但ASLR 随机。 IIRC,(但我可能错了)64位地址的中间32位(假设一个64位的Linux系统)非常随机,达到mmap的结果(因此{{1}使用它)几乎不可预测且不可再现。

BTW,要在实践中看到ASLR,请多次尝试(启用ASLR)以下命令

malloc

此命令显示运行该 cat /proc/self/maps 命令的address spacevirtual memoryprocess)的文本表示。当你多次运行它时,你会看到不同的输出!

要进行调试memory leaks,请使用valgrind。使用最近的 GCC 4.9或更高版本(或最近的 Clang/LLVM)编译器,address sanitizer也很有用,因此您可以编译使用cat然后gcc获取所有警告,即使是额外的警告,然后-Wall -Wextra获取调试信息,然后-g