问题标签 [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.

0 投票
1 回答
1723 浏览

c - 无法找出粉碎堆栈段错误

我最近在用“shellcoder's handbook”一书做一些非常棒的堆栈练习。
但是当我尝试在我的 Ubuntu11.04 上测试一些代码时,我总是会遇到段错误。
情况如下:

起初我写了 exit_shellcode.s (只是简单的 exit(0) 函数):

然后我得到十六进制代码:

之后我制作了 wack.c:

编译: gcc -mpreferred-stack-boundary=2 -ggdb -fno-stack-protector -o wack wack.c

但是当我运行它时收到段错误。

这是 gdb 结果:

shellcode 数组

在f中,ebp和ret=0x080483b7

经过一番si,ret=0x0804a010,就是shellcode数组的地址。

在一些 si 之后出现段错误,我无法理解。

你能帮我么?

0 投票
2 回答
2434 浏览

c - 检测到堆栈粉碎。C 编程

我正在尝试运行 C 程序。它似乎工作正常,但最后它显示:

检测到堆栈破坏

这是代码:

有谁知道为什么会这样?我在谷歌做了很多研究,但我尝试的每一个可能的答案都没有奏效。任何帮助都会非常有帮助。

谢谢你们!!

0 投票
1 回答
2083 浏览

c - 调用函数后检测到 C 堆栈粉碎

有一个对我来说毫无意义的问题。所以这里是:

我有一个函数可以计算一个单词在文件中出现的次数,因此这个函数返回一个整数(int)。所以在另一个函数上它使用“计数器”。现在由于某种原因,它决定开始启动堆栈粉碎检测到的错误。我已经对整个程序进行了 2 周的测试,它运行得非常完美。现在我得到了那个错误,这真的没有意义。世界上到底发生了什么?错误就在那里,在函数有计数器并返回后,它会启动堆栈粉碎检测到的错误。

编辑:我一直在搜索,是的,当返回一个 int 函数时,我得到一个堆栈粉碎检测错误。有任何想法吗?如果我取出该代码,它不会崩溃。真的我不知道

有什么建议吗?

谢谢...

0 投票
1 回答
772 浏览

linux - 堆栈粉碎测试环境

我正在尝试在 virtualbox 中测试缓冲区溢出攻击,并且由于各种发行版的所有安全功能,过去几周一直在苦苦挣扎。

我已经尝试一步一步地在线学习教程,但没有成功。

我没有尝试禁用所有安全功能,而是尝试使用旧的 linux 发行版,但其中大多数没有 gcc 并且现在缺少工作存储库。

我什至在 Ubuntu 10.10(我也下载了)上找到了一个逐步进行的 youtube 视频,包括禁用各种安全功能的所有命令,但运气不好。我可以得到分段错误,但不是“非法指令”。

是否有一个古老的 linux 发行版我仍然可以在没有这种保护的情况下下载,它附带 gcc(或具有完整存储库的大型 dvd iso 之一),所以我可以测试一下?

0 投票
1 回答
454 浏览

c - 缓冲区溢出示例不适用于 Debian 2.6

我正在尝试制作缓冲区利用示例(来自http://insecure.org/stf/smashstack.html的 example3.c) 在 Debian Lenny 2.6 版本上工作。我知道 gcc 版本和操作系统版本与 Aleph One 使用的版本不同。我使用 -fno-stack-protector 和 sysctl -w kernel.randomize_va_space=0 参数禁用了任何堆栈保护机制。为了解释我的设置和 Aleph One 的差异,我引入了两个参数:offset1 -> 从 buffer1 变量到返回地址的偏移量和 offset2 -> 要跳转多少字节以跳过语句。我试图通过分析汇编代码找出这些参数,但没有成功。因此,我编写了一个 shell 脚本,它基本上运行缓冲区溢出程序,同时具有来自 (1-60) 的 offset1 和 offset2 值。但令我惊讶的是,我仍然无法打破这个程序。如果有人可以指导我,那就太好了。我附上了代码和汇编输出以供考虑。对不起,很长的帖子:)

谢谢。


0 投票
1 回答
637 浏览

c - C 缓冲区中的指令仅作为 sudo 执行

我正在研究 Aleph One 的文章Smashing the Stack for Fun and Profit中描述的缓冲区溢出攻击。

正如文章中所建议的,我编写了一个程序 (shellcode.c),将恶意代码 (shellcode) 植入到环境变量 ($EGG) 中。之后 $EGG 作为参数传递给我希望攻击的程序 (vulnerable.c),导致该程序中的缓冲区溢出并导致 shellcode 的执行。

这就是缓冲区的样子——

[NNNNNNNN...NNNNNNSSSSSS...SSSSSSSRRRRR...RRRRRR]

其中 N 是 NOP 指令(参见NOP sled), S 是我的 shellcode, R 是地址(将地址返回到缓冲区中,这将导致指令指针从代码段跳转到上面的堆栈缓冲区并开始执行指令)。

当我以普通用户的身份运行 shellcode.c 和vulnerable.c 的可执行文件时,我面临以下问题 -当指令指针被重定向到缓冲区并遇到指令时,会导致分段错误。但是,在以 sudo 执行程序时,缓冲区中的指令执行没有任何问题,并且缓冲区中的后续 shellcode 成功执行,从而启动了根终端,从而完成了漏洞利用。谁能解释为什么会发生这种情况?

我禁用了以下保护 - Stack Smashing ProtectionASLRLinux 的 NX(eXecute Disable Bit)。

我正在使用 gcc 4.4.3(目标:i486-linux-gnu)编译并在运行内核 2.6.32 的 Ubuntu 10.04(Lucid Lynx)上执行。

以下是我的两个程序:

易受攻击的.c

外壳代码.c

0 投票
1 回答
560 浏览

c - 使用堆栈粉碎跳过指令

我一直试图通过堆栈粉碎更改返回地址来跳过一条指令。以下代码跳过 main 中的 a++ 并打印输出“1 3”。我已经在 32 位英特尔机器上执行了这段代码。

我无法理解为什么返回地址存储在距 buf 起始地址 24 字节的位移处。我尝试在不同的 32 位英特尔机器上执行相同的代码,我不得不使用 20 字节而不是 24 字节的位移。我把我的理解放在了下图中。我不确定是什么填补了“?”所代表的空白。图中。gcc 是否将任何金丝雀值放在那里,还是我错过了什么?

图链接:http ://www.cse.iitb.ac.in/~shashankr/stack.png

粉碎堆栈 example3.c 混乱提出了同样的问题,但无法解释一般位移的原因。

下图给出了在函数中放置断点得到的堆栈视图。

堆栈内容
(来源:www.cse.iitb.ac.in 上的 shashankr

以下是 main 和 fun 的汇编代码:

0 投票
1 回答
378 浏览

c - 迭代 int 指针时破坏堆栈

我对 C 很陌生,我正在尝试编写一个实用程序来打开所有处理 EV_KEY 事件的事件处理程序,并给我一个文件描述符列表(当它们仍然打开时)。执行所有这些操作的函数似乎运行正常,当我尝试遍历文件描述符时,我得到了一个粉碎的堆栈错误。我尝试使用 gcc 的 -Wall 标志编译每个 C 文件以查找可能导致问题的原因,但它并没有帮助我。这是我的代码:

下面是调用 get_key_handlers() 函数的代码:

最后,这是我正在运行以编译和链接的命令,以及程序的运行时输出:

非常感谢您花时间帮助我解决这个问题;我感谢任何给我的建议或批评!

0 投票
2 回答
4642 浏览

assembly - 使用内联汇编启动 shell

我正在完成一项学校作业,我完全被难住了。教授和助教没有任何帮助,因为他们提供给任何学生的每一个答案都是“继续寻找,答案就在那里”的某种变体。我正在尝试使用以下代码创建一个外壳:

我试图用code[]在网上找到的其他一些例子(包括这个网站)以及教授提供的附加 pdf 中的一个例子来替换。这些都没有用。我使用 gdb 反汇编并尝试构建自己的code[],但也失败了。对于它的价值,我可以说,在普通用户中,我的应用程序在该((void(*)( ))buf)( );行出现段错误,然后在同一行的 root 用户中退出(没有段错误通知)。

我不知道在哪里可以完成这项任务,并且在我理解这个简单的第一步之前,我无法处理任何以后的缓冲区溢出任务。任何帮助将不胜感激。

编辑:我忘了提,我在 OSX 10.8.2 和通过 VirtualBox 的 Ubuntu VM 上都试过这个。我假设它在 OSX 上不起作用,但我很绝望。ha 对于 Ubuntu,我们被要求做:

sudo #sysctl -w kernel.randomize_va_space=0

sudo apt-get install zsh cd/bin sudo rm sh sudo ln -s /bin/zsh /bin/sh

这些命令应该禁用地址空间随机化,安装 zsh 并将其链接到 /bin/sh。我在虚拟机中完成了所有这些任务,没有任何错误

0 投票
3 回答
3743 浏览

c - 缓冲区溢出作为 homeowrk

仍在为安全类学习此缓冲区溢出内容,我正在尝试利用此应用程序中的漏洞:

使用此漏洞利用应用程序:

出于某种原因,当我通过运行漏洞利用创建坏文件时,它不会向其推送任何内容。缓冲区为空或未正确写入。我似乎找不到我的错误,经过不知疲倦的谷歌搜索,我找不到足够的答案。根据我对我使用的填充缓冲区代码的理解,这应该用我的缓冲区地址填充 long_string,然后将我的 shellcode 放在 long_string 的开头(经过一点 NOOP 幻灯片),然后将 long_string 复制回缓冲区。我真的不认为这个或 fwrite 有任何问题。建议?