缓冲区溢出分析第01课:缓冲区溢出分析导论

前言

《缓冲区溢出分析》这一系列的内容是我为“i春秋”所录制的同名视频课程的讲稿汇总。每次我都是在写完课程的文档后,再依据文档内容进行课程的讲解。而本系列的内容也是从零开始,来给大家由浅入深地进行缓冲区溢出漏洞的讲解。整个课程是理论与实践相结合,每讲完几个基础理论后,都会配以实际的软件中的漏洞进行分析,以帮助大家更好地理解漏洞的原理。

课程导论

漏洞指的是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,通常是由程序的编写者在编写时的疏忽造成的。漏洞的存在使攻击者能够在未经允许的情况下访问或者破坏目标系统,这在无形中给用户系统的安全带来了很大的威胁。

一般来说,软件漏洞并不影响程序的正常功能,但是如果被攻击者成功利用,就有可能使得软件去执行额外的恶意代码。漏洞挖掘和利用是一门非常高深的技术,甚至是一门艺术,这些都是顶级黑客才干得了的活儿。

大多数程序漏洞挖掘与内存破坏有关,比如最为常见的缓冲区溢出那样的漏洞挖掘技术。使用这类技术的最终目标是控制目标程序的执行流程,以欺骗程序使其运行一段偷偷植入内存的恶意代码,这样黑客就可以使程序做他想要做的几乎任何事情。

说到溢出,可能在我们的头脑中首先浮现出来的是水的溢出:

图1 水的溢出

水杯的大小是固定的,如果杯子没有装满,那么就不会有什么问题。可是一旦装满了,还继续装的话,那么这个时候,水就会不断地溢出。

在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。

当然在理想的情况下,程序会检查每个数据的长度,并且不允许超过缓冲区的长度大小,但有些程序会假设数据长度总是与所分配的存储空间相匹配,而不做检查,从而为缓冲区溢出埋下隐患。

那么我们应该如何利用缓冲区溢出呢?一般情况下,溢出的数据会覆盖掉相邻区域的内容。我们可以利用溢出的数据,使计算机执行我们想要的命令。这就是很多漏洞公告上说的:“黑客可以用精心构造的数据……”道理就是这样。

作为初学者,如果还不熟悉这个概念,可先把缓冲区溢出利用理解为允许攻击者往某个程序变量中放一个比预期长度要长的值,由此以当前运行该程序的用户的特权执行任意命令。

第一个缓冲区溢出攻击——Morris蠕虫,发生在1988年,由罗伯特莫里斯(Robert Morris)制造,它曾造成全世界6000多台网络服务器瘫痪。时至今日,溢出攻击依旧是安全领域的热门话题,,比如乌云网(WooYun.org)总会有关于缓冲区溢出类漏洞的报告:

图2 某软件的缓冲区漏洞概要

这是关于兴业银行的,提交于2014年9月22日的,关于“缓冲区溢出”的漏洞报告。下面是宜信平台的溢出报告:

图3 某平台的堆栈溢出漏洞概要

可见缓冲区溢出漏洞确实是普遍存在的。

最后再讲一下我们这个系列的课程安排,首先会给大家分析基础的缓冲区溢出漏洞的原理以及利用方法,以及基础 ShellCode的编写方法,随着课程的不断深入,我会不断地完善我们的 ShellCode,并且结合真实的漏洞案例进行分析。之后还会给大家介绍更多种类的缓冲区溢出方法,还有缓冲区溢出漏洞的高级防范措施等。我希望本系列的课程能够培养大家的安全意识,扩展大家的思维,使得大家在学习完这一系列的课程之后,都能打下坚实的基础,令每一位朋友都能够成为安全领域的专家。

人生有一半掌握在上帝那里,另一半攥在自己的手中。

缓冲区溢出分析第01课:缓冲区溢出分析导论

相关文章:

你感兴趣的文章:

标签云: