《缓冲区溢出分析》这1系列的内容是我为“i年龄”所录制的同名视频课程的讲稿汇总。每次我都是在写完课程的文档后,再根据文档内容进行课程的讲授。而本系列的内容也是从零开始,来给大家由浅入深地进行缓冲区溢出漏洞的讲授。全部课程是理论与实践相结合,每讲完几个基础理论后,都会配以实际的软件中的漏洞进行分析,以帮助大家更好地理解漏洞的原理。
漏洞指的是在硬件、软件、协议的具体实现或系统安全策略上存在的缺点,通常是由程序的编写者在编写时的忽视酿成的。漏洞的存在使攻击者能够在未经允许的情况下访问或破坏目标系统,这在无形中给用户系统的安全带来了很大的要挟。
1般来讲,软件漏洞其实不影响程序的正常功能,但是如果被攻击者成功利用,就有可能使得软件去履行额外的歹意代码。漏洞发掘和利用是1门非常精深的技术,乃至是1门艺术,这些都是顶级黑客才华得了的活儿。
大多数程序漏洞发掘与内存破坏有关,比如最为常见的缓冲区溢出那样的漏洞发掘技术。使用这类技术的终究目标是控制目标程序的履行流程,以欺骗程序使其运行1段偷偷植入内存的歹意代码,这样黑客就能够使程序做他想要做的几近任何事情。
说到溢出,可能在我们的头脑中首先显现出来的是水的溢出:
图1 水的溢出
水杯的大小是固定的,如果杯子没有装满,那末就不会有甚么问题。可是1旦装满了,还继续装的话,那末这个时候,水就会不断地溢出。
在计算机内部,输入数据通常被寄存在1个临时空间内,这个临时寄存的空间就被称为缓冲区,缓冲区的长度事前已被程序或操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那末数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。
固然在理想的情况下,程序会检查每一个数据的长度,并且不允许超过缓冲区的长度大小,但有些程序会假定数据长度总是与所分配的存储空间相匹配,而不做检查,从而为缓冲区溢出埋下隐患。
那末我们应当如何利用缓冲区溢出呢?1般情况下,溢出的数据会覆盖掉相邻区域的内容。我们可以利用溢出的数据,使计算机履行我们想要的命令。这就是很多漏洞公告上说的:“黑客可以用精心构造的数据……”道理就是这样。
作为初学者,如果还不熟习这个概念,可先把缓冲区溢出利用理解为允许攻击者往某个程序变量中放1个比预期长度要长的值,由此以当前运行该程序的用户的特权履行任意命令。
第1个缓冲区溢出攻击――Morris蠕虫,产生在1988年,由罗伯特莫里斯(Robert Morris)制造,它曾造玉成世界6000多台网络服务器瘫痪。时至本日,溢出攻击照旧是安全领域的热门话题,比如乌云网(WooYun.org)总会有关于缓冲区溢出类漏洞的报告:
图2 某软件的缓冲区漏洞概要
这是关于兴业银行的,提交于2014年9月22日的,关于“缓冲区溢出”的漏洞报告。下面是宜信平台的溢出报告:
图3 某平台的堆栈溢出漏洞概要
可见缓冲区溢出漏洞确切是普遍存在的。
最后再讲1下我们这个系列的课程安排,首先会给大家分析基础的缓冲区溢出漏洞的原理和利用方法,和基础 ShellCode的编写方法,随着课程的不断深入,我会不断地完善我们的 ShellCode,并且结合真实的漏洞案例进行分析。以后还会给大家介绍更多种类的缓冲区溢出方法,还有缓冲区溢出漏洞的高级防范措施等。我希望本系列的课程能够培养大家的安全意识,扩大大家的思惟,使得大家在学习完这1系列的课程以后,都能打下坚实的基础,令每位朋友都能够成为安全领域的专家。