【问题标题】:Using ASLR To Get Random Anonmous Mapping Address使用 ASLR 获取随机匿名映射地址
【发布时间】:2018-04-23 18:53:35
【问题描述】:

考虑在最新的 Ubuntu 16.04 x86_64 系统上运行此代码:

void main(int argc, char *argv[])                                                                      
{                                                                                                      
    while(1) {                                                                                         
        char *x = (char *)mmap(0, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   
        printf("%p\n", x);                                                                             
        munmap(x, 1000);                                                                               
    }                                                                                                  
}                                                                                                      

谁的输出看起来像这样:

0x7f02ca14c000
0x7f02ca14c000
0x7f02ca14c000
0x7f02ca14c000
...

我已经预料到了,提供了零地址提示,并且全局启用了 ASLR 以在此处获取随机地址。

是否可以在随机地址上 mmap() 匿名共享内存?

【问题讨论】:

标签: c memory mmap aslr


【解决方案1】:

使用我上面的测试代码的这个稍微修改过的版本:

void main(int argc, char *argv[])                                                                      
{                                                                                                      
    if (argc < 2) return;                                                                              
    int iter = strtol(argv[1], NULL, 10);                                                              
    for(int i = 0; i < iter; i++) {                                                                    
        char *x = (char *)mmap(0, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);   
        printf("stack=%p mmap=%p\n", main, x);                                                         
        munmap(x, 1000);                                                                               
    }                                                                                                  
} 

运行测试 4 次迭代,我得到了相同的地址:

$ ./rndmap 3  
stack=0x5623b6ff3830 mmap=0x7fe8a29b7000                
stack=0x5623b6ff3830 mmap=0x7fe8a29b7000                              
stack=0x5623b6ff3830 mmap=0x7fe8a29b7000

这是我最初的问题 - 为什么映射不是随机地址。我通过一次迭代(./rndmap 1)多次运行测试来回答我自己的问题,结果如下:

stack=0x559714ce7830 mmap=0x7f6956ac9000    
stack=0x55b74b293830 mmap=0x7faafb7c0000
stack=0x564665b22830 mmap=0x7f56baf12000

因此可以得出结论,Linux 中的 ASLR 部分负责随机化堆基地址,而不是单个内存映射。这就是为什么每次运行二进制文件时地址都会发生变化,并且对于每个 mmap() 我们都会得到相同的随机基地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多