我试图通过在 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;
但是我很快发现,过多地篡改它会导致内核恐慌。而且我怀疑它会使系统变得不稳定,即使只是对其进行了一些篡改(它很可能靠运气存活了一段时间?)。
这促使我问了一个关于为什么会发生这种情况的问题(原始问题为什么堆栈必须是页面对齐的?)。显然这是因为(如用户“mpe”所述)默认堆栈大小为 8 kiB,即 8192 字节。那么通过扩展增加内核中的堆栈大小,这个参数(8192)应该可以增加吗?还提到堆栈本身的位置可以是随机的。
帕克斯会这样做吗?如果不是,那为什么不呢?
内核中如何/在哪里指定堆栈大小?这对于 32 位和 64 位有什么不同吗?
32位和64位之间有什么区别吗?64 位仍然使用 process.c 来处理这些东西吗?我看到在 process_64.c 中似乎没有与此代码等效的内容。