我尝试了通过修改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] 举报,一经查实,本站将立刻删除。