微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux上的ASLR限制

我尝试了通过修改process.c中的arch_align_stack(),在自己的x86 32位机器上“改善”ASLR,方法是在第二个参数中增加模数:

if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) sp -= get_random_int() % 8192; return sp & ~0xf;

不过,我很快发现,这太多的篡改导致内核恐慌; 而且我怀疑它会使系统变得不稳定,即使只是篡改它(它可能在一段时间里幸运地存活了一段时间,最有可能?)。

这促使我问一个为什么会发生这样的问题(原来的问题为什么堆栈必须页面alignment? )。 显然这是因为(如用户“mpe”所述)如果是8kB,即8192字节,那么认堆栈大小。 因此,通过扩展内核中的堆栈大小,这个参数(8192)应该可以增加吗? 还有人提到,堆栈本身的位置可能是随机的。

pax是否这样做? 如果没有,那为什么不呢?

为什么堆栈必须是页面alignment的?

为什么堆栈的“逻辑底部”和“物理底部”的偏移是随机的?

在Linux上堆栈的ASLR熵位

如何禁用Linux上的二进制地址空间随机化?

强制Windows加载DLL的地方,以便内存最小碎片

内核中指定的堆栈大小如何/在哪里? 这对于32位和64位有所不同吗?

这是32位和64位之间的区别吗? 64位仍然使用process.c这个东西? 我看到在process_64.c中没有任何东西与此代码相同。

使用NX(DEP)和ASLR启用x86-64上的基于string的溢出

苹果自己的ASLR实现如何工作?

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

Windows中的堆随机

ASLR和Windows系统DLL的非感知可执行文件

即使在香草核中,堆的位置也是随机的。 请注意,函数load_elf_binary() 调用 randomize_stack_top()化堆栈位置的randomize_stack_top() 。 这个函数是Linux堆栈ASLR的主要部分。

在Linux内核中对ASLR的很好的描述可以在这里找到。 你可能会主要感兴趣的部分堆栈随机化 。

实际上arch_align_stack()的主要目的是通过HyperThreading或类似的技术来提高cpu的缓存性能。 此外值8129没有选择,因为堆栈大小(内核堆栈大小确实是8K,但这个功能随机用户堆栈地址),但由于英特尔的建议。 看到这个和这个 。

THREAD_SIZE指定内核堆栈的大小,x86-32和x86-64都是8K,如此处所述。 用户堆栈大小不固定,因为堆栈可能增长,除非受到用户的限制。

arch/x86/kernel/process.c包含32位和64位共同的代码。 这就是为什么arch/x86/kernel/process_64.c (或arch/x86/kernel/process_32.c )中没有等效的代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐