在信息化社会的今天,电脑与网络已经成为人们在工作和休闲中不可或缺的工具,闲暇时人们通过电脑聊天、娱乐、看电影,工作时人们更会用电脑和网络来处理公文、传送文件、甚至进行财务上的业务。于是,便给了黑客可乘之机,他们利用系统的漏洞,专门开发某种程序,在通过添加一系列匹配的参数,就会取得我们电脑的控制权,窥探我们的隐私,盗取我们的信息,乃至给我们带来名誉和财产上的损失,这种程序设计者设计时带来的不足造成的系统漏洞在专业领域就称为溢出。
溢出分类有几种,一是缓冲区溢出,二是内存溢出,还有一种是数据溢出。三种溢出对每个电脑用户的危害都是很大的,小编今天着重给大家介绍下内存溢出的一些基本知识。
可以说,自软件开发出来,内存溢出就已经存在了,并跟随软件开发的发展到了现在,成为了一个历史上存在了几十年的大难题,它也成为了黑客攻击个人电脑,窥探企业机密的最大祸首,著名的比如内存溢出在红色代码病毒事件中的表现,当时引起业界一片恐慌。
而且,根据有关安全部门的调查统计,操作系统中一半以上的安全漏洞都是因为内存溢出所导致的,同时这些漏洞绝大部分与微软的技术紧密相关。虽然微软的软件都是针对的台式机而开发,如果不连通互联网,那么内存溢出不会导致多么严重的后果,但问题是在当下,网络已经成为个人或是企业不可或缺的东西,内存溢出就成为了黑客进行攻击的最有利助手。
导致内存溢出问题的是多样的,一是使用了C或C++ 等非类型安全的语言,内存溢出是 可以说是C语言或C++ 语言难以克服的缺陷,因为它们不检查数组边界,也不检查类型的可靠性。它们开发的程序的目标代码与机器内核十分接近,所以可以直接访问寄存器和内存,这样固然可以大大提升 C或C++ 语言代码的性能,在执行效率上占据优势,但是导致内存溢出问题的概率也要高许多。
二是存取或者复制内存缓冲区采用了不可靠的方式,简言之,就是向只能盛12毫升的试管中倒入了16毫升的溶液,那么多出来的4毫升溶液自然就会溢出了;
三是编译器设置的内存缓冲区与关键数据结构相邻过于紧密,假设某个函数的堆栈与内存缓冲区紧密相连,那么保存的函数返回地址就会与内存缓冲区相邻。黑客就可以复制大量数据到内存缓冲区,这就使得内存缓冲区溢出并将原先保存于堆栈中的函数返回地址覆盖掉,造成损失。
那么对于编程人员来说怎么预防和解决这个问题呢?有两种措施,一是在用 C/C++ 书写代码时,应该处处留意处理来自用户的数据的方式,当一个函数的数据来源不可靠,同时又用到内存缓冲区时,那么它就必须严格遵循1.必须得到内存缓冲区的总长度;2.检验内存缓冲区3.从源代码开始提高警惕。第二种措施是,利用一些新技术,因为指望程序员永不犯错几乎是不可能的,那么现在开发了一些新技术如基于探测方法、堆栈防御、分割控制和数据堆栈等让底层系统自动保护程序以避免内存溢出的问题。
总而言之,虽然当今黑客频频攻击,系统漏洞很多,但是我们还是要相信通过不断的努力,可以将入侵者挡在安全门之外,放心的用电脑和网络这个大家工作和生活中的好帮手啦!