针对缓冲区溢出漏洞所做的一些改进

为了阻止缓冲区溢出漏洞或者使利用缓冲区溢出进行攻击变得更加困难,编译器和操作系统都做了一些改进。

栈随机化

攻击者通常构造输入字符串来构造指向注入代码的指针值,生成这个指针值需要知道存储输入字符串的栈地址,在一些老的系统中进程的栈地址是可以高度预测的。

在安装有相同版本操作系统的机器上运行相同版本的程序,这些进程的栈地址都是相同的。如果某个攻击者在他自己的机器上知道了一个通用的Web服务器的栈地址,那么他就能够很容易的攻击其他的机器。随机化栈的思想就是使得同一程序的各个运行实例的栈地址不一定是相同的。这样的话,虽然一份相同的代码在许多机器上运行,但是它们的栈地址都是不同的。具体的实现办法就是,在程序启动的时候,在该进程的栈空间上随机分配一定数量的字节(数目在0到n之间),这些字节不会给本进程使用,这样就使得接下来所分配的空间在栈中的地址随着进程的不同而不同。以下是演示栈随机化的代码:

int main() {
   int local;
   printf("local at %p\n", &local);
   return 0;
}

以上程序仅仅是打印出来局部变量local的内存地址,在安装有32位Linux系统的机器上多次运行这段代码,比如运行10000次,我们将会看到该地址值的变化范围是[0xff7fa7e0 ,0xffffd7e0],范围大小大概是2的23次幂。栈随机化已经成为了Linux系统的标准实践,程序的不同部分包括代码,库代码,栈,全局变量以及堆数据都在每次运行的时候都被加载到内存的不同区域而不是固定的。这么做可以阻止一些类型的攻击,攻击者想要攻击成功将变得没那么容易,他需要挨个尝试各个情况下内存地址的变化情况。

posted on 2017-08-20 11:43  kobe_tim  阅读(525)  评论(0编辑  收藏  举报

导航