c++ - *** 检测到堆栈粉碎 *** : <unknown> terminated Aborted (core dumped) Error only occurring sometimes?

标签 c++ c++11 buffer-overflow

我正在完成家庭作业(因此我无法发布代码),并且我很少收到此运行时错误:

* 检测到堆栈粉碎 * : 终止
中止(核心转储)

当我之后再次运行可执行文件时,一切正常。是否有原因为什么此错误仅有时出现?作为引用,我试图完成的作业让我们将文件中的数据加载到两个 vector 中,并对数据进行二进制和线性搜索,以查看 vector 1 中的数据是否出现在 vector 2 中。

谢谢!

编辑:附加信息:当我收到此错误时,输入数据没有任何变化。我可以运行完全相同的可执行文件,一次使用完全相同的输入数据并让它工作,第二次运行它,得到堆栈粉碎错误,然后运行完全相同的东西,让它再次正常工作。

最佳答案

*** stack smashing detected ***顾名思义,当您粉碎堆栈时会发生错误,这意味着您有缓冲区溢出并且金丝雀被不同的值覆盖。
这是 gcc/g++ 实现的一种安全机制,用于防止缓冲区溢出漏洞利用 -fstack-protector .

要避免此错误,请禁用 fstack-protector在 gcc 中编译代码时使用

g++ myProgram.c -o myProgram -fno-stack-protector

编辑 1
但是,禁用堆栈保护将消除此错误,但您可能会收到 segmentation fault由于覆盖堆栈。

如果这是一项计算机安全任务,您正在处理缓冲区溢出漏洞,那么您需要找出绕过这些安全机制,如果您不熟悉它,那么不知何故,您正在溢出缓冲区,而无需查看代码,我可以'对问题究竟出在哪里没有太多评论。

查看来自 vector 1 的数据是否出现在 vector 2 中 这确实看起来像是缓冲区溢出类型的分配,您需要相互覆盖数组的内容。
这个错误的事实并不一致,因为有时金丝雀不会被覆盖(程序的良好运行)或被相同的确切值覆盖,有时金丝雀会被不同的值覆盖导致此错误。

您需要配置编译器以使其更容易发生缓冲区溢出。

编辑 2

您的程序行为是随机的,因为您可能没有禁用 ASLR(地址空间布局随机化)。当你编译你的程序时,你的编译器 gcc/g++ 会针对安全机制优化你的可执行文件,以防止缓冲区溢出漏洞。

Address space layout randomization (ASLR) is a computer security technique involved in preventing exploitation of memory corruption vulnerabilities. In order to prevent an attacker from reliably jumping to, for example, a particular exploited function in memory, ASLR randomly arranges the address space positions of key data areas of a process, including the base of the executable and the positions of the stack, heap and libraries.



这意味着地址空间分配是随机的,并且 vector 之间的字节每次都不同。有时溢出的缓冲区不会到达金丝雀,有时会。
为了每次都获得一致的行为,您还需要禁用 ASLR。 ASLR 支持由您的操作系统提供。要禁用 ASLR,在 Linux 上通过设置 randomize_va_space 禁用它。到 0. 可以通过
echo 0 > /proc/sys/kernel/randomize_va_space

关于c++ - *** 检测到堆栈粉碎 *** : <unknown> terminated Aborted (core dumped) Error only occurring sometimes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61115393/

相关文章:

c# - 使用 .net 监控非托管程序

c++ - 将uint32_ts和uint_8ts写入char文件,然后将它们转换回uint32_ts和uint_8ts

c++ - 使此 C++ 代码通用

c++ - Boost元函数类高阶函数

c - 如何关闭 gcc 编译器优化以启用缓冲区溢出

c++ - 将函数指针传递给算法时选择正确的重载

c++ - 修改std::vector是否会使迭代器无效?

c++ - 被 vector<unique_ptr> 击败

c++ - 不应该发生的缓冲区溢出(?)

c - 溢出 scanf ("%8s",字符串)?