匿名用户
1级
2015-01-27 回答
如前所述,大多数exploit程序都是通过对堆栈返回地址进行操作,并将其设为想要的值来实现 。
返回地址是子程序调用的基本特性,并且不可能被完全替代。所以从逻辑上,首先
要做的就是保证程序的返回地址指向可信任的代码而不是恶意的攻击代码。这也正是Execshield,
Intel 和AMD提供的NX(Not eXcutable)技术和微软的Data Execution Prevention技术所采取的方式。
偶然关注这个话题的人也许会想,这些技术为何产生,这种行为(not excutable)为什麽不是
本来就有的呢?原因要追溯到x86架构的底层。在x86架构中,CPU对有权限从一段内存中读取或是执行一段代码是不加区分的。出于对8086的兼容性,这种机制被保留下来时,但这显然是我们所不愿接受的。
The Segment Limit Approach(段限制策略)
ExecShield 以及与其类似的技术(PaX) 会估算一个地址,并由此将执行代码和读写
代码分开(一个源自与80386特性相类似的机制 (Ring???)).增加了段边界限定的
效果就是前N兆字节的虚拟地址是可执行的,而剩下的则不可。N的值由操作系统内核
来计算。
因为段边界地址的存在,操作系统必须能够保证执行代码处于段边界的前部。 而数据段
尤其堆栈段(在ELF中对应.date .bss 和.stack段)必须位于高位内存。
当越界执行发生时(violation of the execution permission)程序会触发段错误
(segmentation fault (signal 11???))并且终止程序。这种行为等价于一个应用