gpt4 book ai didi

c - 地址空间布局随机化 ( ALSR ) 和 mmap

转载 作者:IT王子 更新时间:2023-10-29 01:12:20 33 4
gpt4 key购买 nike

我预计,由于地址空间布局随机化 (ALSR),从另一个进程派生的进程在调用 mmap 时将返回不同的地址。但正如我发现的那样,事实并非如此。为此,我制作了以下测试程序。 malloc 返回的所有地址对于父项和子项都是完全相同的。请注意,cl1cl2pl1pl2malloc 在内部使用 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com