题目
什么是缓冲区溢出?
答案
@[toc] --- ## 什么是缓冲区溢出 **当程序向输入缓冲区中写入数据的程序使该缓冲区的容量过载时**,就会发生缓冲区溢出,就好比将 12 盎司的牛奶倒入 8 盎司的杯子中,**这会导致相邻存储器位置被覆盖**。换句话说,过量的信息被传递到没有足够空间的容器中,而这些信息最终会替换相邻容器中的数据。 攻击者可以利用缓冲区溢出修改计算机的内存,以破坏或控制程序的执行。 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/202305252257580.png) ## 攻击者如何利用缓冲区溢出 攻击者可以故意将精心制作的输入馈入程序,程序将尝试将该输入存储在不够大的缓冲区中,因此输入会覆盖连接到缓冲区空间的部分内存。如果程序的内存布局定义明确,则攻击者可以故意覆盖已知包含可执行代码的区域。然后,攻击者可以用自己的可执行代码替换这些代码,这可以大大改变程序的工作方式。 例如,如果内存中的被覆盖部分包含一个指针(指向内存中另一个位置的对象),则攻击者的代码可以用另一个指向漏洞利用有效载荷的指针来替换该代码。这样就可以将整个程序的控制权转移给攻击者的代码。 ## 谁容易受到缓冲区溢出攻击 某些编程语言比其他编程语言更容易发生缓冲区溢出。C 和 C++ 是两种脆弱性较高的热门语言,因为它们不包含内置的保护措施以防止访问或覆盖内存中的数据。Windows、Mac OSX 和 Linux 都包含用这两种语言编写的代码。 Java、PERL 和 C# 等更现代的语言具有内置特性,可帮助减少缓冲区溢出的机会,但不能完全阻止缓冲区溢出。 ## 如何防范缓冲区溢出攻击 现代操作系统具有运行时保护,可帮助防护缓冲区溢出攻击。我们来探讨有助于防护漏洞利用风险的 2 种常见保护措施: - **地址空间随机化** - 随机重新排列进程的关键数据区的地址空间位置。缓冲区溢出攻击通常依赖于了解重要的可执行代码的确切位置,地址空间的随机化可以使这种了解几乎不可能。 - **防止数据执行** - 标记内存的某些区域(可执行或不可执行),防止漏洞利用运行不可执行区域中的代码。 软件开发人员还可以通过使用内置保护的语言编写或在其代码中使用特殊的安全性程序,来预防缓冲区溢出漏洞。 尽管存在上述预防措施,但开发人员仍然发现了新的缓冲区溢出漏洞,有时是在遭遇成功的漏洞利用之后。发现新漏洞时,工程师需要修补受影响的软件,并确保该软件的用户可以获取补丁。 ## 缓冲区溢出攻击有哪些类型 缓冲区溢出攻击有很多类型,它们采用不同的策略并针对不同的代码段。以下是一些最著名的类型。 - 堆栈溢出攻击 - 这是最常见的缓冲区溢出攻击类型,涉及到调用堆栈上的缓冲区溢出。 - 堆溢出攻击 - 这种类型的攻击针对开放的内存池中称为堆的数据*。 - 整数溢出攻击 - 在整数溢出中,算术运算得出对于要存储结果的整数类型而言太大的整数;这可能导致缓冲区溢出。 - Unicode 溢出 - Unicode 溢出通过将 Unicode 字符插入需要 ASCII 字符的输入中来创建缓冲区溢出。(ASCII 和 unicode 是使计算机表达文本的编码标准。例如,字母“a”由 ASCII 中的数字 97 表达。虽然 ASCII 码仅用于表达西方语言中的字符,但 unicode 可以为地球上几乎所有书面语言创建字符。因为 unicode 中有更多可用的字符,所以许多 unicode 字符大于最大的 ASCII 字符。)