可以映射零页面还是写入零地址?

时间:2014-02-20 15:17:29

标签: c pointers

我很惊讶地发现Zero Page可以映射到x86和某些架构下。至少在Solaris上的情况下,他有一个通过映射零页面来利用漏洞的例子。这基本上是memset地址零。

据我所知,地址0及其周围是专门设置的,以防止被访问,至少在Windows上。但我不太确定,所以我自己编写了一些代码here

#include <stdio.h>
#include <string.h>

int main(void) {
    // your code goes here
    void* mem = (void*)-1;
    memset( mem, 0x00, 4*1024 );

    return 0;
}

正如预期的那样,至少在ideone上,它会崩溃。是否真的存在映射零页面的情况?

2 个答案:

答案 0 :(得分:3)

在许多操作系统上,您可以明确地告诉操作系统在哪里映射某些内容,包括第0页。您不能指望在那里映射某些内容,但是您可以在操作系统中进行映射。在类似unix的系统上,可以使用mmap(0, ..., MAP_FIXED ...)完成。

这已被证明是允许在内核和用户空间共享相同地址空间的系统上的一个坏主意,因为它允许NULL解除引用通常只会使内核崩溃升级为更严重的攻击,甚至可能允许攻击者以内核模式运行代码。

在发现这类攻击之后,许多系统明确地阻止将内容映射到第0页(或者更确切地说是在最低虚拟空间中的多个页面以防止更大的偏移到具有NULL指针的缓冲区),但实际上有错误的应用程序在那里需要这种能力,所以一些操作系统仍然允许它,并有精心设计的方案,以防止这种情况被利用。

答案 1 :(得分:1)

包含地址0的页面映射取决于操作系统。对可能根本没有保护的微控制器设计进行成像。