很久以前,曾经写过一篇关于如何保护栈不可执行的文章《栈的保护--windows和linux》,文章的最后谈到了一种很好的方式,就是不用段式保护机制而使用页式保护机制,在页表项中做文章,但是这种方式有一个前提就是页表项必须支持可执行位,传统的x86 是不支持的,也就是说传统的x86处理器仅仅支持读写保护,不支持可执行保护,这么说来如果不用段式保护,纯粹的页式保护是不可能做到保护数据不可执行的。很多文档上说段式机制已经成了鸡肋,纯粹是为了兼容而保留的,现在看来为了实现不可执行保护必须用段式机制,我不知道这是不是x86架构的缺陷,在 linux的源代码中,有下列定义:

#define _PAGE_NX (1ULL<<_PAGE_BIT_NX)

#else

#define _PAGE_NX 0

#endif

#define PAGE_SHARED_EXEC /

__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)

#define PAGE_COPY_NOEXEC /

__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)

可以看出,传统的x86处理器是不支持NX位的,但是看看PPC,是支持的。因此x86处理器下的个人PC会危机重重,更严重的是一片混乱,代码中到处挂钩子而没有什么好的底层机制可以禁止,不管是病毒还是安全软件本身都是都采用了一些不太雅观的方式,也许是以暴制暴吧,另外仅仅由于页表项没有支持NX位,这样就多了几种缓冲区溢出的方式,可是正是由于x86的这种乱七八糟的松散设计才使得很多安全厂商得以生存,因为它们和恶意代码在同一条船上。

Logo

更多推荐