问题标签 [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 - 缓冲区溢出 - 普通用户中的 SegFaults
下面是我的代码,包括易受攻击的程序(stack.c)和我的漏洞利用程序(exploit.c)。此代码适用于教授发送给 Windows 用户的预打包 Ubuntu 9(我有一个朋友在他的计算机上对其进行了测试),但是在我在 iMac 上运行的 Ubuntu 12 上,当我尝试执行此操作时会出现段错误在普通用户中。
这是堆栈:
并利用:
为了在 Ubuntu 12 中编译这些,我使用了:
同样,它适用于 root 用户,而不是普通用户;
无论如何,这是在午夜到期的,我在这个限制下一瘸一拐地完成了剩下的任务,但如果有人有建议,我宁愿正确地完成它。我想在认输之前先请专家。我正在寻找为什么此代码无法在普通用户中运行(因为它应该在旧版本的 ubuntu 上运行)但在 root 用户中运行。我还需要更改什么才能在普通用户中进行这项工作。
c++ - gtest 和 cstdarg 之间是否存在不良交互,或者我真的错过了这里的堆栈粉碎?
我下面的代码是一个简单的错误记录系统,其行为方式类似于 printf。
我的所有代码都在 gtest 环境中运行良好,但现在当我退出程序中的一个确定性点(我的一个测试)时,它堆栈崩溃了。在我写这篇文章之前,我的代码一直运行良好,这是我第一次尝试 cstdarg,所以它是最可疑的。
我在代码的其他地方多次调用 WriteCallError ,经过一定次数后它会呕吐并告诉我我的堆栈已粉碎。
我的错在哪里?cstdarg 和 gtest 之间有什么奇怪的交互吗?这里有足够的信息吗?
编辑:使用一个简单的 main 我尝试将其隔离:
这不会导致堆栈粉碎。
c - 检测到堆栈粉碎..在发送 ICMP 数据包时
我写了一个C
程序来发送一个ICMP
数据包。这是对应的代码..
代码的问题是,当我运行它时,icmp 数据包已成功发送,我可以在wire shark
. 但最后显示后sent successfully
我得到以下错误..
请告诉我我错过了什么......谢谢。
c - 将 int 转换为十六进制格式的字符串
当我试图像这篇文章一样进行粉碎堆栈漏洞利用时:http ://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html ,我遇到了一个需要将堆栈指针转换为字符串。
我知道如何以十六进制格式(使用 printf)打印出 int,但不知道如何将其存储为内部字符串表示形式。我需要将它作为字符串在内部存储,以便我可以将它传递给 memcpy 函数。
我需要的理论函数是下面的“convertFromIntToHexCharStar”。
它旨在将此函数用作参数。它给出了堆栈指针。
我想将堆栈指针转换为十六进制字符*,这样我就可以像这样执行 memcpy:
我需要用十六进制表示的地址填充内存,因为我知道它在过去有效。
因此,我要寻求的是帮助将其转换为字符串,或者另一种更简单的方法来执行此 NOP 雪橇(这是我要解决的真正问题)。我打算多次填写地址,这样会增加覆盖堆栈上的返回地址的几率,但为简洁起见,我只给出了一行代码,将“地址”写入“缓冲区”。
我已经搜索了 stackoverflow 和谷歌,但找不到任何东西。在此先感谢您的帮助!
gdb - 为什么 EIP 内容不执行?
我使用缓冲区溢出并在堆栈中的 ret 地址上写入。当我用 gdb 调试它时,我了解到 eip 设置为我想要的地址。该地址是 libc 中的一个小工具。指令的操作码设置正确,但它只是不执行它们,我收到以下消息:
为什么?这是什么信息?
请看下面的数据:
要执行的小工具是:
c - Stacksmashing 甚至无需访问任何数据
在我的机器上,以下代码显然会产生 stacksmashing:
如果它没有在您的机器上崩溃,请尝试用520721
更疯狂的数字替换,例如 1000 万。我的输出是:
然后崩溃。如果我替换520721
为520720
我得到:
然后也崩溃了。相反,如果我替换printf(" ")
为printf("")
(抑制空格,打印空字符串),程序运行正常,我得到
最后,在我测试的所有案例中int *tempData[520721];
,用int *tempData=malloc(520721*sizeof(int));
后续测试的成功malloc()
和使用来代替。free(tempData);
如您所见,我所做的只是调用 in 中的第一个函数main
,它创建一个非常大的本地int
表,然后将指向该int
表的指针传递给第二个函数。第二个函数除了 s 什么都不printf
做,甚至不接触指针或它指向的数据。
我只是想知道我的机器到底发生了什么……为什么这段代码会导致崩溃?
非常感谢您的洞察力!
c - 我不断收到错误“检测到堆栈粉碎”
我正在用 C 编程并用 gcc 编译。每次编译时,我都会收到一个堆栈粉碎检测到的错误。这是什么意思,我该如何解决?
c++ - 粉碎堆栈
所以我正在为一个安全类分配任务,任务是使用堆栈溢出来调用从未在程序中使用过的函数 oopsDidISmashTheStack。
我理解在 buf 变量是 sfp 之后的概念,然后我无法弄清楚的返回地址是将返回值更改为函数所在的地址 0x080484fc 的输入。我认为填充缓冲区需要 12 个字符,然后我的印象是 sfp 并返回 4 个字节,所以我尝试用另外 4 个随机字符填充 sfp,然后使用 \xfc\x84\x04\x08 来制作返回地址指向函数。
如果有人熟悉堆栈内存的工作原理并且可以解释我哪里出错了,那会很棒吗?
c++ - 堆栈粉碎不火灾。为什么?
我正在尝试让 glibc 检测堆栈粉碎,我使用以下代码:
如果 argv[1] 长度大于 5,我希望检测到堆栈粉碎错误,但是,我没有,并且 valgrind 没有检测到错误。我应该改变什么来得到这个错误?(数组 a 必须是二维的)