问题标签 [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 回答
4636 浏览

c - 缓冲区溢出 - 普通用户中的 SegFaults

下面是我的代码,包括易受攻击的程序(stack.c)和我的漏洞利用程序(exploit.c)。此代码适用于教授发送给 Windows 用户的预打包 Ubuntu 9(我有一个朋友在他的计算机上对其进行了测试),但是在我在 iMac 上运行的 Ubuntu 12 上,当我尝试执行此操作时会出现段错误在普通用户中。

这是堆栈:

并利用:

为了在 Ubuntu 12 中编译这些,我使用了:

同样,它适用于 root 用户,而不是普通用户; 例子

无论如何,这是在午夜到期的,我在这个限制下一瘸一拐地完成了剩下的任务,但如果有人有建议,我宁愿正确地完成它。我想在认输之前先请专家。我正在寻找为什么此代码无法在普通用户中运行(因为它应该在旧版本的 ubuntu 上运行)但在 root 用户中运行。我还需要更改什么才能在普通用户中进行这项工作。

0 投票
2 回答
76 浏览

c++ - gtest 和 cstdarg 之间是否存在不良交互,或者我真的错过了这里的堆栈粉碎?

我下面的代码是一个简单的错误记录系统,其行为方式类似于 printf。

我的所有代码都在 gtest 环境中运行良好,但现在当我退出程序中的一个确定性点(我的一个测试)时,它堆栈崩溃了。在我写这篇文章之前,我的代码一直运行良好,这是我第一次尝试 cstdarg,所以它是最可疑的。

我在代码的其他地方多次调用 WriteCallError ,经过一定次数后它会呕吐并告诉我我的堆栈已粉碎。

我的错在哪里?cstdarg 和 gtest 之间有什么奇怪的交互吗?这里有足够的信息吗?

编辑:使用一个简单的 main 我尝试将其隔离:

这不会导致堆栈粉碎。

0 投票
1 回答
403 浏览

c - 检测到堆栈粉碎..在发送 ICMP 数据包时

我写了一个C程序来发送一个ICMP数据包。这是对应的代码..

代码的问题是,当我运行它时,icmp 数据包已成功发送,我可以在wire shark. 但最后显示后sent successfully我得到以下错误..

请告诉我我错过了什么......谢谢。

0 投票
1 回答
2463 浏览

c - 将 int 转换为十六进制格式的字符串

当我试图像这篇文章一样进行粉碎堆栈漏洞利用时:http ://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html ,我遇到了一个需要将堆栈指针转换为字符串。

我知道如何以十六进制格式(使用 printf)打印出 int,但不知道如何将其存储为内部字符串表示形式。我需要将它作为字符串在内部存储,以便我可以将它传递给 memcpy 函数。

我需要的理论函数是下面的“convertFromIntToHexCharStar”。

它旨在将此函数用作参数。它给出了堆栈指针。

我想将堆栈指针转换为十六进制字符*,这样我就可以像这样执行 memcpy:

我需要用十六进制表示的地址填充内存,因为我知道它在过去有效。

因此,我要寻求的是帮助将其转换为字符串,或者另一种更简单的方法来执行此 NOP 雪橇(这是我要解决的真正问题)。我打算多次填写地址,这样会增加覆盖堆栈上的返回地址的几率,但为简洁起见,我只给出了一行代码,将“地址”写入“缓冲​​区”。

我已经搜索了 stackoverflow 和谷歌,但找不到任何东西。在此先感谢您的帮助!

0 投票
0 回答
238 浏览

gdb - 为什么 EIP 内容不执行?

我使用缓冲区溢出并在堆栈中的 ret 地址上写入。当我用 gdb 调试它时,我了解到 eip 设置为我想要的地址。该地址是 libc 中的一个小工具。指令的操作码设置正确,但它只是不执行它们,我收到以下消息:

为什么?这是什么信息?

请看下面的数据:

要执行的小工具是:

0 投票
1 回答
33 浏览

c - Stacksmashing 甚至无需访问任何数据

在我的机器上,以下代码显然会产生 stacksmashing:

如果它没有在您的机器上崩溃,请尝试用520721更疯狂的数字替换,例如 1000 万。我的输出是:

然后崩溃。如果我替换520721520720我得到:

然后也崩溃了。相反,如果我替换printf(" ")printf("")(抑制空格,打印空字符串),程序运行正常,我得到

最后,在我测试的所有案例中int *tempData[520721];,用int *tempData=malloc(520721*sizeof(int));后续测试的成功malloc()和使用来代替。free(tempData);

如您所见,我所做的只是调用 in 中的第一个函数main,它创建一个非常大的本地int表,然后将指向该int表的指针传递给第二个函数。第二个函数除了 s 什么都不printf做,甚至不接触指针或它指向的数据。

我只是想知道我的机器到底发生了什么……为什么这段代码会导致崩溃?

非常感谢您的洞察力!

0 投票
1 回答
1501 浏览

c - 我不断收到错误“检测到堆栈粉碎”

我正在用 C 编程并用 gcc 编译。每次编译时,我都会收到一个堆栈粉碎检测到的错误。这是什么意思,我该如何解决?

0 投票
1 回答
317 浏览

c++ - 粉碎堆栈

所以我正在为一个安全类分配任务,任务是使用堆栈溢出来调用从未在程序中使用过的函数 oopsDidISmashTheStack。

我理解在 buf 变量是 sfp 之后的概念,然后我无法弄清楚的返回地址是将返回值更改为函数所在的地址 0x080484fc 的输入。我认为填充缓冲区需要 12 个字符,然后我的印象是 sfp 并返回 4 个字节,所以我尝试用另外 4 个随机字符填充 sfp,然后使用 \xfc\x84\x04\x08 来制作返回地址指向函数。

如果有人熟悉堆栈内存的工作原理并且可以解释我哪里出错了,那会很棒吗?

0 投票
2 回答
590 浏览

c++ - 堆栈粉碎不火灾。为什么?

我正在尝试让 glibc 检测堆栈粉碎,我使用以下代码:

如果 argv[1] 长度大于 5,我希望检测到堆栈粉碎错误,但是,我没有,并且 valgrind 没有检测到错误。我应该改变什么来得到这个错误?(数组 a 必须是二维的)

0 投票
1 回答
875 浏览

c - C 缓冲区溢出 - 返回地址不能用 ASCII 表示