
上QQ阅读APP看书,第一时间看更新
2.3.3 缓冲区溢出
当向为某特定数据结构分配的内存空间的边界之外写入数据时,即会发生缓冲区溢出。C和C++都容易发生缓冲区溢出问题,因为这两种语言具有以下共同之处。
·将字符串定义为以空字符结尾的字符数组
·未进行隐式的边界检查
·提供了未强制性边界检查的标准字符串函数调用
取决于内存的位置以及溢出的规模,缓冲区溢出可能不会被侦测到,但它可能会破坏数据,导致程序出现奇怪的行为甚至非正常中止。
缓冲区溢出是一个令人头痛的问题,因为在软件的开发和测试阶段并非总能发现该问题。并非所有C和C++实现在编译过程中总能识别可能引发缓冲区溢出的安全缺陷,在运行时也不会报告越界写问题。静态分析工具可以帮助我们发现在早期开发过程中的缓冲区溢出问题,不过一旦测试数据可以引发一个可侦测的溢出,我们就可以使用动态分析工具来发现缓冲区溢出问题。
并非所有的缓冲区溢出都会造成软件漏洞。然而,如果攻击者能够操纵用户控制的输入来利用安全缺陷,那么缓冲区溢出就会导致漏洞了。例如,有一些广为人知的技术可以用于覆写栈帧以执行任意的代码。缓冲区溢出也可以在堆或静态内存区域被利用,它的做法是通过覆写邻接内存的数据结构。
在我们深入了解这些利用行为之前,理解进程内存是如何组织和管理的是非常必要的。如果你对进程内存组织、执行栈以及堆管理等主题已经非常熟悉,可以直接跳到2.5节。