1988 年 11 月,许多组织不得不因为“Morris 蠕虫”而切断 Internet 连接,“Morris 蠕虫”是 23 岁的程序员 Robert Tappan Morris 编写的用于攻击 VAX 和 Sun 机器的程序。 据有关方面估计,这个程序大约使得整个 Internet 的 10% 崩溃。 2001 年 7 月,另一个名为“Code Red”的蠕虫病毒最终导致了全球运行微软的 IIS Web Server 的 300,000 多台计算机受到攻击。2003 年 1 月,“Slammer”(也称为“Sapphire”)蠕虫利用 Microsoft SQL Server 2000 中的一个缺陷,使得南韩和日本的部分 Internet 崩溃,中断了芬兰的电话服务,并且使得美国航空订票系统、信用卡网络和自动出纳机运行缓慢。所有这些攻击 ―― 以及其他许多攻击,都利用了一个称做为 缓冲区溢出 的程序缺陷。
1999 年 Bugtraq(一个讨论安全缺陷的邮件列表)进行的一次非正式调查发现,三分之二的参与者认为第一号的缺陷就是缓冲区溢出(要了解相关背景,请参阅本文后面 参考资料部分列出的“Buffer Overflows: Attacks and Defenses for the Vulnerability of the Decade”一文)。从 1997 年到 2002 年 3 月,CERT/CC 发出的半数安全警报都基于缓冲区缺陷。
如果希望自己的程序是安全的,您需要知道什么是缓冲区溢出,如何防止它们,可以采用哪些最新的自动化工具来防止它们(以及为什么这些工具还不足够),还有如何在您自己的程序中防止它们。
缓冲区以前可能被定义为“包含相同数据类型的实例的一个连续计算机内存块”。在 C 和 C++ 中,缓冲区通常是使用数组和诸如 malloc()
和 new
这样的内存分配例程来实现的。极其常见的缓冲区种类是简单的字符数组。 溢出 是指数据被添加到分配给该缓冲区的内存块之外。
如果攻击者能够导致缓冲区溢出,那么它就能控制程序中的其他值。虽然存在许多利用缓冲区溢出的方法,不过最常见的方法还是“stack-smashing”攻击。Elias Levy (又名为 Aleph One)的一篇经典文章“Smashing the Stack for Fun and Profit”解释了 stack-smashing 攻击,Elias Levy 是 Bugtraq 邮件列表(请参阅 参考资料 以获得相关链接)的前任主持人。
为了理解 stack-smashing 攻击(或其他任何缓冲区攻击)是如何进行的,您需要了解一些关于计算机在机器语言级实际如何工作的知识。在类 UNIX 系统上,每个进程都可以划分为三个主要区域:文本、数据和堆栈。 文本区域包括代码和只读数据,通常不能对它执行写入操作。 数据区域同时包括静态分配的内存(比如全局和静态数据)和动态分配的内存(通常称为 堆)。 堆栈区域用于允许函数/方法调用;它用于记录函数完成之后的返回位置,存储函数中使用的本地变量,向函数传递参数,以及从函数返回值。每当调用一个函数,就会使用一个新的 堆栈帧来支持该调用。了解这些之后,让我们来考察一个简单的程序。
void function1(int a, int b, int c) { char buffer1[5]; gets(buffer1); /* DON'T DO THIS */}void main() { function(1,2,3);} |
假设使用 gcc 来编译清单 1 中的简单程序,在 X86 上的 Linux 中运行,并且紧跟在对 gets()
的调用之后中止。此时的内存内容看起来像什么样子呢?答案是它看起来类似图 1,其中展示了从左边的低位地址到右边的高位地址排序的内存布局。
相关推荐
《寒江独钓--Windows内核安全编程》是一份深入探讨Windows操作系统内核安全编程的珍贵资源,由知名技术专家“寒江独钓”编著。这份资料包含了丰富的Windows内核驱动开发实例,覆盖了从磁盘驱动、文件系统驱动到网络...
在深入探讨Windows内核安全编程之前,我们先要理解什么是Windows内核以及为什么它如此重要。Windows内核是操作系统的核心部分,负责管理硬件资源、调度进程、处理中断和提供系统服务。由于内核运行在最高权限级别...
《华为C&C++语言安全编程规范》是华为公司制定的一套详细且严谨的编程准则,旨在提高软件开发过程中的安全性,防止因编程错误导致的安全漏洞。这套规范基于C和C++语言,对于这两种广泛使用的系统级编程语言提出了...
《Windows内核安全编程》是深入探讨Windows操作系统内核安全机制的一份宝贵资源。源码的提供使得读者能够更直观地理解理论知识,并通过实践来加强理解。在Windows内核安全编程领域,开发者需要掌握一系列关键概念和...
### 网络安全编程基础知识点详解 #### 一、网络安全编程概述 网络安全编程是确保网络数据传输过程中信息完整性和保密性的关键技术之一。随着互联网技术的发展,网络安全的重要性日益凸显,网络安全编程也成为了...
《软件安全实现:安全编程技术》是一本图书,全书共分为16章,针对安全编程技术进行讲解,主要涵盖了基本安全编程、应用安全编程、数据保护编程以及其他内容共四大部分:第一部分包含内存安全、线程/进程安全、异常/...
基本信息 作者: 《黑客防线》编辑部 林聚伟 ...《Windows内核安全编程从入门到实践》适合大专院校计算机系的学生、Windows程序员、从事信息安全行业的工程师以及所有对Windows内核安全编程感兴趣的爱好者使用。
《PHP应用程序安全编程》是Tricia Ballad撰写的一本专著,主要针对PHP开发者,旨在帮助他们理解和实施安全的编程实践。PHP作为一种广泛使用的开源脚本语言,常用于Web开发,但同时也因为其灵活性和易用性,可能导致...
《寒江独钓——Windows内核安全编程》是一份针对Windows操作系统内核安全编程的珍贵资源,其中包含了大量的代码示例和实践经验,旨在帮助开发者深入理解Windows内核的工作原理,并学习如何在内核级别编写安全、高效...
网络安全编程基础是IT领域中一个至关重要的主题,它涉及到如何在设计、开发和维护软件时考虑安全性,以防止网络攻击和数据泄露。在这个快速发展的数字时代,网络安全编程已经成为每一个程序员和系统管理员必须掌握的...
### 信息安全技术应用软件安全编程指南 #### 一、引言与背景 随着信息技术的快速发展,应用软件在各个领域扮演着越来越重要的角色。然而,软件中存在的安全漏洞也日益成为不容忽视的问题。为了确保软件产品的安全...
《Windows内核安全编程》是一本深入探讨Windows操作系统内核层面安全问题的专业书籍。试读内容涵盖前三章,虽然不完整,但足以让我们对Windows内核安全编程的基础知识有所了解。下面将根据这些章节的内容,详细阐述...
由于提供的文件信息中不包含实际的文本内容,而仅仅是与文档打印相关的URL和时间戳,无法从中提取有关网络安全编程技术的具体知识点。因此,为了回答您的要求,我将基于标题和描述中提到的“网络安全编程技术与实例...
Java语言安全编程规范是开发高质量、健壮且安全的软件应用程序的基础。在Java中,安全性不仅涉及代码的正确性,还包括防止恶意攻击、数据保护以及遵循最佳实践来降低潜在的安全风险。以下是一些核心的Java安全编程...
《华为C&C++语言安全编程规范-V3.1》是一份详细指导C和C++编程人员遵循的安全编码标准,旨在增强编程人员的安全意识,培养攻击者思维,编写出安全可靠的代码。该规范适用于所有使用C/C++语言进行开发的人员。 1. **...
Python安全编程是一门利用Python语言进行信息安全研究的编程课程,它广泛应用于端口扫描、漏洞利用、网络嗅探、数据收集等方面。以下是从提供的文件信息中提取的知识点。 1. 端口扫描:端口扫描是指使用特定的软件...
Windows内核安全编程是开发操作系统核心组件的关键领域,它涉及到编写高效、稳定且安全的代码,以确保系统在处理敏感操作时不会受到攻击或崩溃。在这个主题中,我们主要会探讨以下几个方面: 1. **Windows内核基础*...
免费的华为版本C语言安全编程规范,让大家的C语言变得更规范,减少开发过程中问题的出现
《Windows内核安全编程》是一本深入探讨Windows操作系统内核编程和安全技术的专业书籍。它为读者揭示了Windows操作系统的核心机制,以及如何在这一层面上进行安全编程,以防止潜在的系统漏洞和攻击。 Windows内核是...