我正在完成作业(因此我无法发布代码),并且很少出现此运行时错误:
*检测到堆栈粉碎*: 终止
中止(核心转储)
当我再次运行可执行文件后,一切正常。是否有原因导致此错误仅有时出现?作为参考,我试图完成的作业要求我们将文件中的数据加载到两个向量中,并对数据进行二进制和线性搜索,以查看向量 1 中的数据是否出现在向量 2 中。
谢谢你!
编辑:附加信息:当我收到此错误时,输入数据没有任何变化。我可以运行完全相同的可执行文件,一次使用完全相同的输入数据并让它工作,第二次运行它,得到堆栈粉碎错误,然后运行完全相同的东西,并让它再次正常工作。
*** stack smashing detected ***
顾名思义,当您粉碎堆栈,这意味着您有缓冲区溢出并且canary被不同的值覆盖。
这是 gcc/g++ 实现的安全机制,用于防止缓冲区溢出漏洞利用-fstack-protector
.
要避免此错误,请禁用fstack-protector
在 gcc 中编译代码时使用
g++ myProgram.c -o myProgram -fno-stack-protector
Edit 1
但是,禁用堆栈保护将消除此错误,但您可能会得到segmentation fault
作为覆盖堆栈的结果。
如果这是一项计算机安全任务,您正在研究缓冲区溢出漏洞,那么您需要弄清楚如何绕过这些安全机制,如果您不熟悉它,那么不知何故,您会溢出缓冲区,并且无需查看代码我就可以'问题到底出在哪里,就不多评论了。
查看向量 1 中的数据是否出现在向量 2 中这确实看起来像是一种缓冲区溢出分配,您需要相互覆盖数组的内容。
事实上,这个错误并不一致,因为有时金丝雀不会被覆盖(程序的良好运行)或被相同的精确值覆盖,有时金丝雀会被不同的值覆盖,从而导致此错误。
您需要配置编译器以使其更容易发生缓冲区溢出。
Edit 2
您的程序行为是随机的,因为您可能没有禁用 ASLR(地址空间布局随机化)。当您编译程序时,编译器 gcc/g++ 会优化可执行文件的安全机制,以防止缓冲区溢出漏洞。
地址空间布局随机化 (ASLR) 是一种计算机安全技术,涉及防止利用内存损坏漏洞。为了防止攻击者可靠地跳转到例如内存中的特定被利用函数,ASLR 随机排列进程关键数据区域的地址空间位置,包括可执行文件的基址以及堆栈、堆的位置和图书馆。
这意味着地址空间分配是随机的,并且向量之间的字节每次都不同。有时溢出的缓冲区不会到达金丝雀,有时会到达。
为了每次都获得一致的行为,您还需要禁用 ASLR。 ASLR 支持由您的操作系统提供。要禁用 ASLR,在 Linux 上可以通过设置禁用它randomize_va_space
到 0。可以通过以下方式实现
echo 0 > /proc/sys/kernel/randomize_va_space
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)