2014-02-20 42 views
1

我很惊讶地读到零页可以在x86和某些架构映射。至少在Solaris上的情况下,他有一个通过映射零页面进行利用的例子。这基本上是memset的地址零。是否可以映射零页或将地址零写入?

在我的理解地址0和周围的人建立专门被访问,至少在窗口保护。但我不能肯定这一点,所以我写了一些代码,自己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,它崩溃。真的有映射零页的情况吗?

回答

1

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

3

在许多操作系统,您可以明确地告诉操作系统,其中一些映射包括0页你不能指望的东西在那里映射,但你可以在搏斗操作系统进入映射的东西在那里。在类Unix系统上,可以使用mmap(0, ..., MAP_FIXED ...)来完成。

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

在发现这类攻击之后,很多系统都明确地阻止将事物映射到页面0(或者更确切地说,映射到最低虚拟空间中的若干页面,以防止使用NULL指针更大地偏移到缓冲区中),但实际上有越野车那些需要这种能力的应用程序,所以一些操作系统仍然允许它,并有精心设计的方案来防止它被利用。

+0

所以Windows和其它操作系统不允许它呢? – zinking

+0

不幸的是我不知道细节。我已经看到了它残酷地固定(如:绝不允许)在两个不同的操作系统和听到别人在做怪黑客的传闻。但我没有比这更多的细节。你必须研究你的特定操作系统来找出它所做的和不允许的。 – Art