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

c++ - 奇怪的堆栈粉碎错误 - 由未使用的、未初始化的成员变量引起

今天我遇到了一个有趣的错误,显然我的堆栈被破坏了,覆盖了 G++ 返回点金丝雀(我认为这是使用的保护)。

我的违规课程是这样的:

问题是,客户端变量是在初始化列表中初始化的,但不是端点(它没有在 ClientSendContext 中使用,因为它只发送到一个端点,但没关系)。我执行测试(或类似的东西)每 3 次就会发生一次粉碎堆栈,这很奇怪,因为我做的事情完全相同(一定是线程计时问题)。

但是,一旦我删除了端点变量,它就可以正常工作了!怎么会这样?它没有以任何方式使用,g++ 没有警告我... Valgrind 也很安静。

(有高代表的人可以编辑我的问题并添加堆栈粉碎或类似的东西作为标签吗?)

好的,在 pastebin 上发布了包含更多代码的更新:

http://pastebin.com/xiWx8xjV

这应该是调用的所有方法。最里面的 send 方法是模板类的一部分。当 UdpServer 使用它时,相同的发送方法可以正常工作。我现在有点难过。

编辑:代码现在直接放在这里:

和错误信息:

0 投票
1 回答
245 浏览

c - 机器之间差异堆栈粉碎行为的原因

我们正在尝试在一些生成的代码中追踪一些堆栈粉碎错误。问题是堆栈粉碎错误不是 100% 确定性的,并且只发生在一台机器上而不是其他机器上。行为差异可能有哪些原因?

我们正在使用堆栈保护器标志运行 gcc。

0 投票
4 回答
10461 浏览

c - 如何从命令行提供标准输入?

我正在尝试对课程分配的程序执行缓冲区溢出攻击。攻击程序和易受攻击的程序都是我编写的。

易受攻击的代码用于scanf从标准输入读取数据。

./vulnerable < malicious_payload_file.txt工作正常。 more malicious_payload | ./vulnerable并且echo JUNK_JUNK_JUNK_JUNK | ./vulnerable也可以按预期工作。

但是,我想使用攻击程序来不断提供更长的有效载荷,直到程序崩溃。所以,我需要动态生成更大的垃圾有效载荷。我system ("./vulnerable");用来反复调用和测试异常退出。

如何指定这样的有效载荷?

有没有办法运行./vulnerable < malicious_payload_binary或以某种方式运行,这样我就不必将恶意有效负载放在文件中,而是可以在命令行中指定它?

0 投票
2 回答
1595 浏览

buffer-overflow - 如何让 Linux 在堆栈上执行数据?

我有一个 Core i7 720QM 处理器,并且正在运行 Slackware 13.37(32 位)作为虚拟机。作为一项课堂作业,我必须编写一个易受攻击的程序并粉碎堆栈。但是,在大多数计算机上,这不起作用,因为存在某种堆栈执行预防(NX 位?),当 CPU 检测到尝试在堆栈上执行数据时,这会产生“分段错误”。

有没有办法通过sysctl或类似的方式向内核发出信号以忽略这一点?

0 投票
1 回答
865 浏览

c - 堆栈粉碎和 sscanf

replyS|[2 3 4 5 6 7 8 9]|[2 3 4 5 6 7 8 9]

它会导致堆栈粉碎。我知道 sscanf 通常是不安全的,但我想知道为什么它在这里失败 - 当输入字符串正常时。

这是输出:

* 检测到堆栈粉碎 * : ./testClient 终止 ======= 回溯:========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0x1f5df0] /lib/i386-linux-gnu/libc.so.6(+0xe5d9a)[0x1f5d9a] ./testClient[0x804b336] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x126e37] . /testClient[0x804add1]

======= 内存映射:======== 00110000-0026a000 r-xp 00000000 08:01 523281 /lib/i386-linux-gnu/libc-2.13.so 0026a000-0026b000 ---p 0015a000 08:01 523281 /lib/i386-linux-gnu/libc-2.13.so 0026b000-0026d000 r--p 0015a000 08:01 523281
/lib/i386-linux-gnu/libc-2.13.so 002600d000-00260-e p 0015c000 08:01 523281 /lib/i386-linux-gnu/libc-2.13.so 0026e000-00271000 rw-p 00000000 00:00 0 00271000-00286000 r-xp 00000200 08:031i6
-linux-lib/ /libpthread-2.13.so 00286000-00287000 r--p 00015000 08:01 523299 /lib/i386-linux-gnu/libpthread-2.13.so 00287000-00288000 rw-p 00016000 08:031 523299 /i
/lib/ gnu/libpthread-2.13.so 00288000-0028a000 rw-p 00000000 00:00 0 003e8000-00404000 r-xp 00000000 08:01 523304
/lib/i386-linux-gnu/ld-2.13.so 00404000-00405000 r--p 0001b000 08:01 523304 /lib/i386-linux-gnu/ld-2.13.so 00405000-00406000 rw-p 0001c000 08:01 523304 /lib/i386-linux-gnu/ld-2.13.so 004c9000-004d0000 r-xp 00000000 08:01 523283
/lib/i386-linux-gnu/librt-2.13.so 004d0000-004d1000 r--p 000060008:00 01 523283 /lib/i386-linux-gnu/librt-2.13.so 004d1000-004d2000 rw-p 00007000 08:01 523283 /lib/i386-linux-gnu/librt-2.13.so 0053f000-005400000000000000 r-xp 0000 00 0 [vdso] 007c9000-007ed000 r-xp 00000000 08:01 523303
/lib/i386-linux-gnu/libm-2.13.so 007ed000-007ee000 r--p 00023000 08:01 523303 /lib/i386-linux /libm-2.13.so 007ee000-007ef000 rw-p 00024000 08:01 523303 /lib/i386-linux-gnu/libm-2.13.so 00cee000-00dcd000 r-xp 00000000 08:01 1051412
/usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 00dcd000-00dd1000 r--p 000de000 08:01 1051412 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14 00dd1000- 00DD2000 RW-P 000E2000 08:01 1051412 / usr/lib/i386-linux-gnu/libstdc++so.6.0.0.14
00DD200DD2200D2200DD29000 RW-P 00000000000000 00:00 0008000000000900000000000000000090000000090号
usr/lib/libboost_system.so.1.46.1 00e53000-00e54000 r--p 00002000 08:01 1070941 /usr/lib/libboost_system.so.1.46.1 00e54000-00e55000 rw-p 00003000 41 /8:01 107/lib /libboost_system.so.1.46.1 00e9c000-00eb6000 r-xp 00000000 08:01 523308
/lib/i386-linux-gnu/libgcc_s.so.1 00eb6000-00eb7000 r--p 00019000 08:01 523308 /lib/i386-linux-gnu/libgcc_s.so.1 00eb7000-00eb8000 rw-p 0001a000 08:01 523308 /lib/i386-linux-gnu/libgcc_s.so.1 08048000-08067000 r-xp 00000000 08:01 1591111
/home/alex/pj/cpp/testClient/bin/Debug/testClient 08067000-08068000 r--p 0001e000 08:01 1591111
/home/alex/pj/cpp/testClient/bin/Debug/testClient 08068000-08069000 rw-p 0001f000 08:01 1591111
/home/alex/pj/cpp/testClient/bin/Debug/testClient 09050000-09071000 rw-p 00000000 00:00 0 [堆] b78d9000-b78dd000 rw-p 00000000 00:00 0 b78ef000-b78f2000 rw-p 00000000 00:00 0 bfba9000-bfbca000 rw-p 00 0 0000

0 投票
1 回答
614 浏览

c - 我的用于从文本文件中删除行的 c 程序适用于小文件,但在大文件中出现 stacksmash 错误

我正在开发一个程序来过滤 craigslist 结果列表;我想找一个相对便宜的房间出租。完成的程序将删除价格超过 600 美元的行,并创建一个新文件,但现在我要删除带有 $ 字符的每一行,并打印到终端。

该程序在自己的源代码上运行时运行良好,但是当我在从 Firefox 保存的 craigslist 结果的 html 页面上运行它时,它会一直打印到结束 html 括号并抛出堆栈粉碎检测到的警告和回溯。我正在从 K&R 学习 C,所以如果这段代码看起来过时,那就是原因。

0 投票
2 回答
1274 浏览

c - 加载 execl() 函数时获取 root shell 失败

我将上面的 C 程序编译为 root 没有任何类型的堆栈保护 (gcc -fno-stack-protector -o out test.c) 并作为普通用户进行利用。我未能获得 root shell。

这与我从“smashthestack”中利用的代码相同。

0 投票
1 回答
231 浏览

c++ - COM 方法调用意外损坏了堆栈

我有一些代码从 COM 对象 ( IDirect3D9) 调用方法,但每次调用都会导致运行时检查失败 #0。失败是由于 ESP 没有在调用中正确保存,所以某种堆栈问题(因为 COM 方法都是__stdcall)。不寻常的部分是方法签名和环境的简单性。

该代码仅在 32 位模式下构建,带有 MSVC 10 (VS 2010 SP1),使用 DirectX SDK(2010 年 6 月)标头和库。我已经重新安装了 SDK 以确保标头没有损坏,但运气不好。

我已经连接了 VS 的调试器和 WinDBG,以及在重新启动/更新驱动程序后多次运行代码。问题每次都会出现,并且是相同的。在 gflags 中启用堆验证(和大多数其他选项)似乎没有提供更多信息,也没有使用 Application Verifier 运行。两者都只是报告与弹出窗口相同的错误,或者不久之后导致的段错误。

如果没有调用(而是返回一个常量值),程序将按预期运行。我不知道这里可能出了什么问题。

有问题的函数是IDirect3D9::GetAdapterModeCount从 D3D8-to-9 包装器(旧游戏图形升级项目的一部分)调用的。有关更多一般信息,完整文件在此处

我已经尝试了以下所有形式的通话:

所有这些都导致检查失败。m_Object是一个有效的IDirect3D9,并且以前用于各种其他调用,特别是:

该序列由调试跟踪代码记录,看起来是正确的并返回预期值(3 个监视器等)。前 3 次调用,由我的同一个对象(的单个实例CVoodoo3D8)调用,都成功,没有堆栈警告。第四个没有。

如果我对调用重新排序,以便GetAdapterModeCount在同一对象中的任何其他调用之前立即调用,则会出现相同的运行时检查失败。从测试来看,这似乎排除了前一个调用破坏堆栈的可能性。调用这 4 个函数的 4 个方法都发生在不同的位置,并且GetAdapterModeCount从该文件中的任何位置调用都会导致问题。

这将我们带到了不寻常的部分。不同的类 ( CVoodoo3D9) 也调用相同的方法序列IDirect3D9,具有相似的参数,但不会失败(它是 D3D9 的等效包装类)。这些对象不是同时使用的(代码选择或其他取决于我需要的渲染过程),但每次都给出相同的行为。另一个类的代码保存在另一个文件中,这导致我怀疑预处理器问题(稍后会详细介绍)。

在那之后没有提供任何信息,我检查了我的代码和参数的调用约定。再一次,什么都没有曝光。代码库与 SAL 一起编译/w4 /wX并且已经有一段时间了,大多数函数和所有 PREfast 规则都启用(并通过)。

特别是,在此类中调用时调用失败,无论对我的方法的调用来自我的代码还是使用该对象的另一个程序。无论在哪里调用它都会失败,但仅在此文件中。

完整的方法是:

GetAdapterModeCount如果允许执行到该点,则在调用后立即发生检查失败,并在我的方法返回时再次发生。

由 preprocess-to-file 选项给出的预处理器输出具有d3d9.h正确的方法声明(from ):

我的方法的声明本质上是相同的:

我的方法几乎没有扩展,变成:

在声明和定义中,预处理器输出对于这两种方法似乎都是正确的。

到故障点的程序集清单是:

澄清一下,错误出现在6423861F(对 的调用_RTC_CheckEsp),表明调用或准备破坏了堆栈。我的假设是,由于相同的呼叫在其他地方有效,因此呼叫中的某些东西不会破坏事物。

对我未经训练的眼睛来说,唯一不寻常的部分是一对mov register, dword ptr [register+8]。由于它是一个 32 位系统,我不确定是否+8会增加太多,或者如果是这样,它如何进入构建。

在我的方法返回后不久,显然是由于调用中断 ESP,程序段错误。如果我不调用GetAdapterModeCount并简单地返回一个值,程序将按预期执行。

此外,发布版本(无 RTC)在类似的点出现段错误,堆栈:

虽然我不确定地址的含义。据我所知,它与调试版本中的段错误不同。这些在我的方法返回后在程序中,这似乎是在我从 D3D8 检索数据的方法之一期间。编辑:段错误发生在我目前正在调试的稍后调用中。

在这一点上,我完全不知道出了什么问题或怎么回事,并且没有东西可以检查。

0 投票
1 回答
3922 浏览

c - gcc C ***检测到堆栈破坏***数组

导致问题的代码行是

当通过只提供如下 1 个优化选项来编写相同的代码时,它不会返回任何错误。

请帮我解决这个问题。非常感谢任何帮助。谢谢你。

这是整个功能..

}

错误是...

0 投票
2 回答
58848 浏览

c++ - 如何调试“检测到堆栈粉碎”?

我有一个复杂的 C++ 代码。它是一个 FastCGI 程序,使用FastCGI C++ 类库

当我要求它提供一个非常长的网址时,我得到:

对于现实生活中的应用程序,这不是问题,因为我从不使用这么长的 URL,但这意味着任何人都可以终止我的服务器……我不喜欢这样。

有没有工具可以找出这个问题出现在哪里?我该如何使用它?

编辑:已解决

我正在这样做:

看起来对测试200来说太高了。len它实际上在194.

所以我这样做了:

现在,很好。