随机内存地址
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
我正在使用 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