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

本文介绍了栈随机化技术如何防止缓冲区溢出攻击。通过在程序启动时为栈分配随机数量的不可用字节,使得每次运行时栈地址不同,增加了攻击难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

栈随机化

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

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

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

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

转载于:https://www.cnblogs.com/rubytim/p/2890970.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值