作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我预计,由于地址空间布局随机化 (ALSR),从另一个进程派生的进程在调用 mmap
时将返回不同的地址。但正如我发现的那样,事实并非如此。为此,我制作了以下测试程序。 malloc
返回的所有地址对于父项和子项都是完全相同的。请注意,cl1、cl2、pl1、pl2 的 malloc
在内部使用 mmap
因为它们是大块。
所以,我的问题是,为什么即使存在 ALSR,mmap
也不会返回不同的地址。可能是因为这里的随机化种子对于原始进程和 fork 进程是相同的。还是有其他原因?
int main()
{
pid = fork();
if (pid == 0) // child
{
void * c1 = malloc( 4096 );
void * c2 = malloc( 4096 );
void * cl1 = malloc( (long)512e3 ); // internally uses mmap
void * cl2 = malloc( (long)512e3 ); // internally uses mmap
printf( "c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2 );
}
else
{
void * p1 = malloc( 4096 );
void * p2 = malloc( 4096 );
void * pl1 = malloc( (long)512e3 ); // internally uses mmap
void * pl2 = malloc( (long)512e3 ); // internally uses mmap
printf( "p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2 );
}
return 0;
}
最佳答案
ASLR主要是随机化用户空间地址空间顶部到栈下的距离,以及栈底保留空间到第一个mmap
的距离(大概是映射动态链接器)。任何进一步的随机化都会对虚拟内存空间产生严重的碎片化影响,因此会破坏需要制作大型 mmap
的程序(例如,32 位机器上的 1-2 GB 映射)。
我看到一些 Linux 发行版发布了补丁内核,这些内核对 mmap
返回的地址执行了更多的随机化。其中一些甚至为您提供与为堆栈扩展而保留的空间重叠的映射,然后当堆栈增长时它会破坏您的映射(导致巨大的安全漏洞,比任何非随机地址分配可能造成的漏洞都要大得多) .远离这些黑客。
关于c - 地址空间布局随机化 ( ALSR ) 和 mmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9485244/
我预计,由于地址空间布局随机化 (ALSR),从另一个进程派生的进程在调用 mmap 时将返回不同的地址。但正如我发现的那样,事实并非如此。为此,我制作了以下测试程序。 malloc 返回的所有地址对
我是一名优秀的程序员,十分优秀!