C++ 栈溢出已检测

17 Mar 2025 | 4 分钟阅读

C++ 中检测到栈溢出 是由 C 或 Cpp 编译器(如 GCC)和许多运行时环境在发生缓冲区溢出或有人试图将更多数据存储到固定大小的内存中时生成的错误消息。同时,它也是一种安全机制,用于提醒用户和开发人员,表明有人试图破坏程序的栈,这是恶意活动的常见迹象。显示此栈溢出错误后,当前运行的程序将终止,以防止进一步执行并避免恶意风险。

在许多情况下都可能发生此错误。其中一些列举如下:

  • 缓冲区溢出
  • 字符串函数使用不当
  • 函数指针操作
  • 没有基本情况的递归
  • 恶意输入处理
  • 数组索引越界
  • 指针使用不当
  • 标准库容器使用不当
  • 不安全地使用指针
  • 智能指针使用不当

现在,我们将通过示例代码讨论每种情况

1. 缓冲区溢出

每个缓冲区都分配了固定的 栈空间。当程序向缓冲区写入的数据超过了分配的固定大小时,就会导致缓冲区溢出。这意味着写入超出分配的内存会破坏栈,从而导致栈溢出。

示例

输出

Stack smashing detected in C++

避免检测到栈溢出错误的程序

输出

Stack smashing detected in C++

3. 字符串函数使用不当

strcpystrcat 等一些字符串内置函数在没有适当边界检查的情况下使用时,会导致缓冲区溢出。由于这些函数不检查目标缓冲区的大小,因此会导致缓冲区溢出并覆盖相邻的内存块。

4. 函数指针操作

当程序试图通过被操纵或损坏的函数指针调用函数时,会显示此错误。这通常发生在攻击者或程序中的错误更改了函数指针的值时,将其指向一个非预期位置或非函数地址。

示例

导致错误的程序

输出

Stack smashing detected in C++

避免检测到栈溢出错误的程序

输出

Stack smashing detected in C++

4. 没有基本情况的递归

基本情况或基本条件用于递归中,以停止进一步的递归并将所需结果返回给被调用的函数。如果基本条件不满足,递归将不会停止。它会抛出栈溢出错误。此错误是由于栈中填充了函数调用。为了避免此错误,我们可以为任何类型的递归使用适当的基本条件

示例

导致错误的程序

输出

Stack smashing detected in C++

避免检测到栈溢出错误的程序

输出

Stack smashing detected in C++

5. 恶意输入处理

如果用户未正确验证,则允许攻击者输入过长的字符串。因此,攻击者将发送长字符串来溢出缓冲区,从而导致栈溢出。

6. 数组索引越界

如果数组超出其固定大小,我们会收到数组索引 越界错误。当有人尝试使用数组中不存在的索引访问元素时,我们会收到数组索引越界错误。即使数组长度已超出,当我们仍将元素写入数组时,我们会收到数组索引越界错误,这会导致栈溢出错误。

7. 指针使用不当

不正确的指针 解引用操作 可能导致数据写入非预期内存位置。将数据写入非预期内存地址可能会破坏栈或其他程序数据结构。