栈在Linux上开始

问题描述 投票:7回答:1

我以为我可以通过采取变量的地址在主舍入到页边界(考虑到我的筹码向下增长)让我处理堆栈的开始。

我比较这由/proc/self/maps报道的边界,它总是关闭的1,2,或3页(每页4096个字节),从来没有不同的偏移。的差每次运行时和在下面的(杂乱,不简约)管道中使用这个C程序变化表明的差异。

stacksz.c:

#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#define CAT "cat /proc/XXXXXXXXXXX/maps"
#define CATP "cat /proc/%ld/maps"
#define MASK ((sizeof(char)<<12)-1)

int main()
{
    uintptr_t  top = (uintptr_t)&top + MASK & ~MASK;

    char cat[sizeof CAT];
    sprintf(cat,CATP,(long)getpid());
    if(system(cat)) return 1;

    printf(" %lx stack\n", top);
    return 0;
}

bash的管道:

gcc stacksz.c && echo "$(( $(./a.out |grep stack |tr '-' ' ' |cut -d' ' -f2 |sed 's/^/0x/'|tr '\n' -|sed 's/-$//') ))"

我很好奇,如果任何人都可以解释这种现象。该机是Linux precision 4.15.0-43-generic #46-Ubuntu SMP x86_64。 `(我在1000个运行以下的补偿分布:

4096 195
8192 490
12288 315

).

c linux memory
1个回答
4
投票

ASLR第一完全随机化在所述虚拟存储器中的堆栈单元。但它确实更多:它还随机化相对于栈映射的顶部堆栈指针!

从Linux的源代码:

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

这里,如果ASLR是活动的,堆栈指针0-8192字节还原,然后16个字节对齐。这就解释变量的1-3页偏移。

© www.soinside.com 2019 - 2024. All rights reserved.