Linux上的堆栈的ASLR熵位
发布时间:2020-12-14 00:35:42 所属栏目:Linux 来源:网络整理
导读:我正在寻找麻省理工学院的 presentation,他们解释了不同类型的ASLR实现. 例如,他们指出对于静态ASLR,堆栈具有19位的熵.根据我的理解,这意味着堆栈基地址只能随机化以获取2 ^ 19个不同的值. 我想问一下如何计算堆栈有19位的熵? 编辑: 在线查看后,我在Linux
我正在寻找麻省理工学院的
presentation,他们解释了不同类型的ASLR实现.
例如,他们指出对于静态ASLR,堆栈具有19位的熵.根据我的理解,这意味着堆栈基地址只能随机化以获取2 ^ 19个不同的值. 我想问一下如何计算堆栈有19位的熵? 编辑: 在线查看后,我在Linux上发现了一些堆栈ASLR的explanation.从另一个question学习,我认为可能相关的代码是: #ifndef STACK_RND_MASK #define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */ #endif static unsigned long randomize_stack_top(unsigned long stack_top) { unsigned int random_variable = 0; if ((current->flags & PF_RANDOMIZE) && !(current->personality & ADDR_NO_RANDOMIZE)) { random_variable = get_random_int() & STACK_RND_MASK; random_variable <<= PAGE_SHIFT; } #ifdef CONFIG_STACK_GROWSUP return PAGE_ALIGN(stack_top) + random_variable; #else return PAGE_ALIGN(stack_top) - random_variable; #endif } 我想问一下这是否适合推理我的问题? 解决方法
首先,页面必须与4096字节边界对齐,这有效地将低12位置零.
接下来,内核将地址空间拆分为用户内存的0x00000000 – 0xbfffffff和内核内存的0xc0000000 – 0xffffffff.我们这里只关心用户内存,因此可以忽略内核内存. 如果我们进一步将用户地址空间分成三个范围: Range | 2 MSBs --------------------+-------- 00000000 - 3fffffff | 00 40000000 - 7fffffff | 01 80000000 - bfffffff | 10 通常我们不希望堆栈在第一个范围内,因为堆栈就在那里.这意味着我们只有两个可能的组合用于2个最高有效位01和10,有效地将2位变为1. 我们在32位地址中有32位,因此我们可以得到19位的堆栈熵:32 – (页面对齐位) – (存储器分区位)= 32 – 12 – 1 = 19 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |