缓冲区溢出利用如何发生

攻击程序通过溢出为输入流程预留的固定大小的内存缓冲区,使用缓冲区溢出利用来运行可执行代码。此代码可让攻击程序接管目标计算机或破坏其数据。

缓冲区溢出利用有以下两种类型:
  • 基于堆的攻击 – 淹没为程序预留的内存空间,但这些攻击难以执行且很少发生。
  • 基于堆栈的攻击 – 使用堆栈内存对象来存储用户输入,这些攻击最常见。
以下进程说明了基于堆栈的缓冲区溢出攻击:
  1. 常规堆栈内存进程 – 固定大小的堆栈内存对象通常为空,并等待用户输入。当程序接收到来自用户的输入(例如其名称)时,数据将存储在堆栈的顶部,并被分配返回内存地址。堆栈经过处理后,用户的输入将被发送至由该程序指定的返回地址。
  2. 溢出堆栈 – 程序被写入时,会为数据预留特定数量的内存空间。如果写入的数据超出了为其在内存堆栈中预留的空间,堆栈将溢出。仅当与恶意输入结合时才会出现该问题。
  3. 利用溢出 – 如果程序正等待用户输入其名称,但攻击程序输入的可执行命令超出堆栈大小,则该命令将被保存在预留空间之外。
  4. 运行恶意代码 – 因为此命令超出堆栈缓冲区空间,所以不会自动运行。但是如果攻击程序提供了指向恶意命令的返回地址,此命令将自动运行。首先,由于缓冲区溢出,因此程序开始崩溃,但该程序试图使用由攻击程序提供的返回地址进行恢复。如果返回地址为有效地址,将执行恶意命令。
  5. 利用权限 – 由于程序通常以内核模式或继承服务帐户的权限运行,因此,恶意代码现在正使用与受到威胁的应用程序相同的权限运行。这表明攻击程序可以获取对操作系统的完全控制。

缓冲区溢出利用如何发生