问题标签 [stack-smash]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 堆栈粉碎检测到错误
我正在开始一个在 C++ 中包含链表的个人项目,我得到一个堆栈粉碎检测到的错误,但是程序总是一直运行。我不相信这个错误与我创建的 Account 类有关,我做了一些基本的测试,它似乎工作正常。该错误很可能与链表有关。
此外,我刚刚开始用 C++ 编写代码,所以如果您发现任何我可以改进的代码风格,请随时告诉我。
请解释为什么我收到堆栈粉碎错误以及如何修复它。
这是代码:
main.cpp-
链表.h-
LinkedList.cpp-
Account.h-
Account.cpp-
编辑:
这是输出 -
buffer-overflow - 当我们有 execstack 时,与位置无关的可执行文件 (PIE) 有什么意义?
我正在阅读Hacking: The art of exploit,它显然充满了过时的信息(不考虑金丝雀、不可执行堆栈、ASLR)。我试图了解即使在现代系统上是否(以及如何)堆栈溢出攻击也是可能的。到目前为止,我发现的最好的论文是Stack 在现代 Linux 系统上的粉碎,至少是从 2012 年开始的。
似乎真正阻碍堆栈溢出攻击执行任意代码的是金丝雀和位置无关可执行文件(在 gcc 中禁用标志-fno-stack-protector
和-fPIE
)。PIE 使堆栈不可执行,因此即使设法用堆栈地址覆盖返回地址,程序也会崩溃,因为堆栈上的代码不允许执行。
显然,Linux 终端命令readelf -l <filename>
允许知道是否使用 PIE 编译了可执行文件。标题GNU_STACK
是我们应该查看的:如果是RWE
,则允许执行,如果E
缺少,则不是。因此,检查堆栈是否可执行很简单。(值得指出的是,在不反汇编或使软件崩溃的情况下,检查文件是否使用金丝雀保护编译并不容易)
但是,据我了解,可以通过一个名为execstackGNU_STACK
的小工具轻松调整标题。这很容易。它甚至不需要 root 权限(当然,只要文件的所有者不是 root)。RWE
execstack -s <filename>
现在,我的问题是:如果我们可以如此轻松地更改它的设置,那么 PIE 的意义何在?禁用金丝雀需要重新编译整个文件,因为金丝雀检查内置在汇编代码中,但GNU_STACK
标题似乎很容易出错......我错过了什么?
更新: “如果攻击者可以修改标头,那么这意味着攻击者已经实现了代码注入。 ”我不确定这是真的。如果攻击者想要利用可执行文件中的缺陷,他很可能需要另一个可执行文件。例如,在《黑客:剥削的艺术》一书中,漏洞notesearch
是通过 exploit notesearch_exploit
。即使notesearch
有不可执行的堆栈,也可以通过对 execstack in 的 apt 调用轻松使其可执行notesearch_exploit
(鉴于没有 root 权限的事实),从而绕过 PIE 限制。这不正确吗?
c++ - 发生堆栈粉碎时,有什么方法可以避免终止程序?
我在 C++ 中使用 pthread 编写了一个具有 3 个线程的程序。当其中一个线程发生缓冲区溢出时,整个程序终止,其他线程无法运行,并显示此消息:*** stack smashing detected ***: ./a.out terminated
我想堆栈粉碎只杀死其中发生 BOF 的线程,其他线程保持活动状态。所以,我尝试忽略信号,但这并没有解决我的问题。
这是我的程序:
当我用 编译它时g++ a.cpp -lpthread
,输出是这样的:
有没有什么办法可以将堆栈粉碎只导致杀死其中发生BOF的线程,并且程序不会终止?
请注意,我不想使用-fno-stack-protector
选项编译我的程序以避免受金丝雀保护。
assembly - 为了乐趣和利润而粉碎堆栈:jmp offset
为了创建 shellcode,作者将偏移量占位符替换为它们的计算值,即 This
被翻译成这个
但是,我计算出调用偏移量为 0x2a 或 42 字节(1+3+4+7+5+2+3+3+2+5+5+2),偏移量为 -0x2a .
作者是怎么得到0x26和-0x2b的?
c++ - 堆栈粉碎检测到 C++。求解拉普拉斯方程
我正在使用 C++ 求解拉普拉斯方程。我正在求解压力场 P。在我的代码中,您可以在下面看到,P 是 x 和 y 的函数。我将其声明为长度为 nx 和 ny 的二维数组。
我得到的最终矩阵结果 P 是正确的。然而,当我尝试使用“printf”打印这个矩阵 P 时,即使数字是完美的,我也得到了这样的错误:
下面是我的程序:
一开始我以为是迭代次数太高的问题。换句话说,硝酸盐太高了,所以我决定降低它。不过,我得到了同样的错误。你能给我帮助吗?矩阵 P 的输出结果是正确的,所以我不认为这是求解 P 时的逻辑。非常感谢任何帮助,谢谢!
python - 如果 python 可执行文件是通过 `env` 指定的,ptrace 会破坏堆栈
我正在尝试拦截getrandom
系统调用并修改其结果。我试着做一个最小的可重现的例子,这里是:[原始代码库是用 Rust 编写的,有大约 400 行,适当的错误检查并遇到了同样的问题]
python脚本pi.py
如下:
这会触发堆栈粉碎保护:
这个地址区确实超出了栈。此外,当我尝试getrandom
用自定义覆盖器简单地替换 glibc 系统调用时,错误不会出现在任何地方。
更有趣的是,只有当我将可执行文件指定为/usr/bin/env python
. 如果我直接指定/usr/bin/python
,一切都会按预期进行。
此外,如果通过 env 指定 python 可执行文件,则存储在 RDI 和 RSI 寄存器中的参数将无效(被某些内容覆盖)。如果python
直接指定,则不是这种情况。
如果我跟踪直接调用./pi.py
with的执行strace
,即使已修补getrandom
(使用LD_PRELOAD
),也不会发生任何不良情况,并且输出缓冲区被成功覆盖。缓冲区完全包含在堆栈中。
我正在运行 Arch Linux、Linux 4.9.36-1-lts、glibc 2.25、Python 3.6.1。
/edit:它变得更有趣了。如果我使用以下技巧修补 libc getrandom 例程LD_PRELOAD
:
然后未修改的ptrace
程序成功并按预期工作。
/edit2:它变得更加有趣。在系统调用之后添加任何日志记录可以神奇地解决问题。例如这个补丁:https : //gist.github.com/marmistrz/2056c4baec6e910050ddade232decf09 [这是在提交 0d0a32fb91cfea1626e6c6b77a9bc44e15a2b8a 之上测试的]
stack-overflow - 旨在分析 fastq 文件格式的纳米孔工具?
我刚收到我的第一个纳米孔数据集,并收到了一个 fastq 文件。我期待一个 fast5 文件,现在我不确定如何开始过滤数据。我遇到的大多数工具(NanoOK、poretools)都处理 fast5 格式,虽然它们都提供了从 fast5 转换为 fastq 的方法,但它们的工具只接受 fast5 输入。
当我尝试使用 fastq_quality_filter 时,出现堆栈粉碎错误...
c++ - 堆栈粉碎调用python函数导入tensorflow c ++
我是 tensorflow 的新手,并且在 c++ 中包含 python 代码,因此我会对以下奇怪行为的任何提示/评论表示赞赏:我有一个带有 headerfile 的 c++ 类 pythoninterface pythoninterface.h
:
源文件pythoninterface.cpp
:
以及应该包含该函数的 Python 文件(TensorflowIncludePy.py
):
最后在我的 main 函数中,我只创建一个pythoninterface
对象p
并调用该函数p.CallFunction()
。c++ 和 python 代码之间的通信工作正常,但是当(在运行时)import tensorflow as tf
到达该行时,我收到一条*** stack smashing detected ***
错误消息并且程序完成。谁能猜出问题可能是什么或以前有过类似的问题?
我知道有一个 c++ tensorflow API,但我觉得在 python 中使用 tensorflow 更舒服,所以我认为这对我来说可能是完美的解决方案(显然它不是......:P)
ios - 在 ios swift 中启用堆栈金丝雀
我一直在寻找一种在 swift 中为我的 ios 应用程序启用堆栈金丝雀的方法,但后来我发现最新版本的 xcodes 具有启用堆栈金丝雀所需的标志,默认情况下启用。因此,我一直在寻找一种方法来确保启用堆栈金丝雀,并且正如其他网站所说,我尝试使用终端中的 otool 命令($ otool -Iv appName |grep stack_chk)来确保它并期望它返回'stack_chk_guard和stack_chk_fail' 标志,但它没有返回任何值/标志。所以我然后尝试在“其他 C 标志”下手动设置标志“-fstack-protector-all”,但我仍然看不到使用 otool 命令的标志。
我在这里想念什么?还是我误解了什么?我如何确保我的应用程序启用了堆栈金丝雀?