ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c-Linux上的ASLR限制

2019-11-27 14:51:09  阅读:331  来源: 互联网

标签:aslr linux-kernel c-3 linux


我尝试通过在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;

但是我很快发现,对此进行过多篡改会导致内核崩溃.而且我怀疑它即使只是对其进行某种程度的改动也会使系统不稳定(它很可能幸存了一段时间,很可能会这样吗?).

这促使我问一个问题,为什么会发生(原始问题为Why does the stack have to be page aligned?).显然这是因为(如用户“ mpe”所述)默认堆栈大小为8 kiB,即8192字节.因此,通过扩展来增加内核中的堆栈大小,是否可以增加此参数(8192)?还提到了堆栈本身的位置可以随机化.

Pax会这样做吗?如果没有,那为什么不呢?

内核中如何指定堆栈大小? 32位和64位是否不同?

32位和64位之间有什么区别吗? 64位是否仍将process.c用于此内容?我看到在process_64.c中似乎没有什么等效于此代码.

解决方法:

即使在香草内核中,堆栈的位置也是随机的.请注意,函数load_elf_binary()invokes randomize_stack_top()将堆栈的位置随机化.此功能是Linux堆栈ASLR的主要部分.

可以在here中找到有关ASLR在Linux内核中的很好描述.您可能会对堆栈随机化这一部分感兴趣.

实际上,arch_align_stack()的主要目的是通过超线程技术或类似技术来提高CPU上的缓存性能.此外,由于栈大小(内核栈大小的确为8K,但此函数将用户栈地址随机化)而未选择值8129,而是因为Intel建议.参见thisthis.

THREAD_SIZE指定内核堆栈大小,如here中所述,x86-32和x86-64均为8K.用户堆栈大小不固定,因为堆栈可能会增长,除非受用户限制.

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

标签:aslr,linux-kernel,c-3,linux
来源: https://codeday.me/bug/20191127/2075091.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有