问题标签 [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++ - 读取函数的分段错误
我在使用 Stack Smash Protection 时遇到了一些严重的问题,现在我收到了一个新错误 -Segmentation fault-。我认为这与linux具有一些特殊保护这一事实密切相关。谁能解释我为什么在这种特殊情况下会出现分段错误?
更新:我尝试了所有解决方案并修改了代码,但问题仍然存在,所以我尝试将代码简化为:
它仍然给我与 fopen 一致的错误。(这在我正在解决的练习中是强制性的) - 我正在使用 Ubuntu 15.10 和 QT Creator 以及 GCC 编译器。
更新:解决了。我想问题是因为我没有给出 fopen 的完整路径。我是 ubuntu 的新手。显然有一些不同的东西。
linux - 尝试适应“为了乐趣和利润而粉碎堆栈”时出现分段错误
我正在关注经典论文Smashing The Stack For Fun And Profit旁边的“Smashing the Stack in 2011”。尽管有关于这些论文的所有 Q/As,但我找不到我的问题的答案。
我正在尝试运行一个简单的 exit(0) 命令,但调用和 jmp 类似于“Smashing The Stack For Fun And Profit”中的 shellcodeasm.c,所以我可以按照论文进行到底(我设法让它工作当我删除呼叫和 jmp 时)。显然,我的以下 shellcodeasm.c 没有打开 shell,但我保留了“为了乐趣和利润而粉碎堆栈”中的名称,因此我的过程更容易遵循。
shellcodeasm.c
运行gcc -o shellcodeasm -g -ggdb shellcodeasm.c
并使用 gdb 将十六进制从 main+3 获取到 main 的末尾(如论文中所示)我可以生成我的 testc.c
测试c.c
然后我可以使用“Smashing the Stack in 2011”中的技术编译和运行它
但不幸的是,我遇到了分段错误(因为这里没有缓冲区溢出,我猜 -fno-stack-protector 不是必需的,但是当我删除它时它也不起作用)。
有谁知道我不理解/缺少什么?
is的输出和uname -a
isLinux core 3.2.0-4-686-pae #1 SMP Debian 3.2.73-2+deb7u3 i686 GNU/Linux
的输出。我希望我已经提供了所有相关信息。gcc -v
gcc version 4.7.2 (Debian 4.7.2-5)
c - 如何使用粉碎的堆栈启动代码?
我对 C 有非常基本的了解(尽管我确实了解一般的编程概念)。我有一个任务是创建一个缓冲区溢出,它会产生一些东西(比如访问未经授权的区域、免费资金等),而不仅仅是让程序崩溃。
我尝试了不同大小的缓冲区,并且总是可以“崩溃”程序,但我无法让它启动任何代码(即 /bin/su)。我是在错误地接近这个吗?
这是代码:
执行时,如果您输入 25 个字符作为月份的日期,程序将继续执行直到结束。只有在最后一个输入之后,它才会以堆栈粉碎错误而终止。恐怕我正在尝试做一些无法完成的事情,但是一天(字面意思是过去 8 小时)的 Google 搜索并没有产生我能够使用的示例。
有人能把我推向一个不同的方向,让我接近我想要实现的目标吗?谢谢。
c - OS X Yosemite 上的堆栈粉碎?
我无法弄清楚如何在 OS X 10.10.5 (Yosemite) 上禁用堆栈保护。我一直在拼凑来自各种在线线程的有希望的 gcc 标志,但到目前为止还没有设法禁用保护。我目前正在编译我的程序:
但是当我尝试粉碎堆栈时,我会出现段错误。
我在 Red Hat Enterprise Linux Server 7.2 (Maipo) 上尝试过相同的程序,在适当调整内存地址差异后,在编译后粉碎堆栈没有问题:
还可能值得注意的是,与大多数 Mac 一样,我机器上的 gcc 是 clang 的符号链接(Apple LLVM 版本 7.0.0 (clang-700.0.72))。
如何禁用 Yosemite 的堆栈保护?
额外细节
我正在使用的虚拟程序是:
当我运行时otool -tv program
,我注意到以下内容:
success
我要跳转到的例程在 address 0x00001e70
。
我们通常会返回的指令authenticate
位于 address 0x00001efe
。
当我gdb
在输入虚拟密码“xxxxxxxxxx”并使用 检查缓冲区后运行时x/30xb &password
,我观察到:
我们想将第 270xfe
个字节覆盖为0x70
.
当我尝试按如下方式粉碎堆栈时:
我得到一个段错误。
stack-smash - 未将 ROP 攻击链检测为参数
我创建了一个 ROP 攻击链,我知道它可以工作,因为我已经用另一个没有问题代码的程序对其进行了测试。
我的问题是,每当我将我的 ROP 链作为输入参数运行到我的目标二进制文件中时,它就无法通过这部分:
我像这样运行它:./target $(python inject.py)
下面是我的攻击链:
当我删除上面的参数检查时,它可以让我获得对终端的 root 访问权限并且可以正常工作。
这些是我编译程序的头文件: -g -m32 -static -U_FORTIFY_SOURCE -fno-stack-protector
目标已打开 DEP。
c - 堆栈粉碎错误
我应该编写一个从文件中读取网址并执行GET
再次写入文件的请求的机器人。到目前为止这有效,但程序总是以“堆栈粉碎错误”终止。我使用多个“消费者”线程来完成这项工作,当所有GET
请求都完成并且第一个线程完成时,程序终止。
下面是我的代码:
我得到的错误:
* 检测到堆栈粉碎 * : ./bot 终止 make: *** [run] Aborted
这发生在第一个线程完成后。我知道内存中一定有错误,但我不明白为什么会出现这个错误。我在这里错过了什么吗?任何其他提示也很重要!
c - 返回指向数组的指针时堆栈粉碎
我的函数neldermead看起来像这样:
该函数是这样调用的:
输出如下:
使用-fno-stack-protector代码可以正常工作。
我返回数组的方式有什么问题吗?
///////////////////////////////
我修改了代码以通过引用返回。
我的函数neldermead看起来像这样:
该函数是这样调用的:
输出如下:
妈的,没救。
c - 在 Aleph One 上工作时,在 64 位系统上没有堆栈分配
我一直在搞乱 Aleph One 的“Smash the Stack for Fun and Profit”,发现在为我的 64 位处理器编译代码时,没有使用通常的“sub $VALUE, %”分配堆栈内存注册。”
这是函数源代码:
这是编译后的版本
如果我将 -m32 选项与 gcc 一起使用,为什么没有标准堆栈分配?
c - 使用堆栈缓冲区溢出检索信息 (C)
我在网上找到了一个有趣的练习,它指出特定的输入可能会溢出缓冲区,从而将“秘密”打印到标准输出。
我试图自己弄清楚,但我做得不好。
这是代码:
c - 什么是堆栈粉碎(C)?
代码:
输出:
string-1 长度 = 7, char *a = StringA StringB
*** 检测到堆栈粉碎 **** : /T02 终止
中止(核心转储)
我不明白为什么它显示堆栈粉碎?什么是*堆栈粉碎?还是我的编译器的错误?