问题标签 [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 - *** 检测到堆栈粉碎 *** 中止(核心转储)
我正在尝试调试一个给出错误的程序:Abort (core dumped)。Valgrind 检测到堆栈粉碎并给出一个泄漏摘要,其中 1 个块仍然可以到达。它向函数 downloadAndOpen 的第 12 行发出信号,其中我有一个我认为在 main 结束时关闭的 fopen,但似乎不是。我将不胜感激有关此错误的帮助。valgrind 输出为:
编辑:在解决第一个问题后,程序正常工作直到第 18 页后,我得到了一个类似的问题。 Valgrind 报告是:
我已经隔离了问题,但我仍然看不出有什么问题:
下面是主函数的代码:
这就是 Valgrind 抱怨的功能:
程序的其余部分在这里:
和Makefile:
c++ - 堆栈粉碎/回溯
我写了一小段代码,它应该采用一个 char 数组,让它看起来像是计算机正在输入文本。很简单,对吧?但是当我运行它时,终端告诉我:
我是 C++ 新手(我有 C 背景),我不知道堆栈粉碎或回溯是什么。如果你能帮助我,那将有很大帮助!这是代码:
c - C - 检测到堆栈粉碎
我需要对矩阵 A 实现一个非常简单的就地 LU 分解。我正在使用高斯消元法,我想用 3x3 矩阵对其进行测试。问题是,我不断收到stack smashing
错误,我不知道为什么。我在我的代码中没有看到任何问题,这可以做到这一点。你有什么主意吗?
问题可能出在分解块中。
c - 在 shellcode 中转义空字符
我正在尝试overflow1.c
从 Aleph One 的 Smashing the Stack for Fun and Profit 论文中执行。
原overflow1.c代码:
此代码在 32 位系统上运行良好。
我修改了代码以在 64 位系统上工作:
程序只加载shellcode,然后用.的地址覆盖返回地址buffer
。代码按预期工作。
然而,这就是问题出现的地方。
假设buffer
64 位系统上的地址是0x7fffffffdc10
,然后long int
将其转换为0x00007fffffffdc10
。当 this 写入large_string
时,00
充当 null 并终止字符串。我该如何克服呢?
我不能将地址类型转换为整数,因为 64 位系统有 8 个字节地址而不是 4 个字节地址。如何转义“0x00”空字符?
assembly - 修改 ROP 小工具
我有一个看起来像这样的ROP小工具-
正如您一定猜到的那样,它只会产生一个“/bin//sh”。我希望它生成一个远程 shell,其命令是:
谁能帮我创建一个小工具来执行远程shell。我尝试查看此链接,但不太了解。
c - 为什么变量'pass'在堆栈缓冲区溢出后改变它的值?
我无法理解buf1
和pass
in发生了什么main()
。我知道在缓冲区溢出后gets(buf1)
:
- 首先(通过输入超过 15 个字符),我们实际上是在更改调用函数的调用框架
main()
- 其次(如果保持输入超过 19 个字符),那么我们将开始更改调用函数的返回地址
main()
。
但是为什么在gets
( buf1
) ( 123456789012345**6**
) 中的 16 个字符之后我们得到等于 54 (这是 ASCII 码6
)。我们不会溢出pass
变量,为什么我们会得到这个pass = 54
?
c - 利用缓冲区漏洞时从单独的函数返回地址
我必须使用一串 shell 操作码来利用下面代码中的缓冲区漏洞。我几乎已经看到了 Google 建议的所有内容,但由于功能分离,这个特殊问题让我感到困惑。
我很好奇如何readIn()
使用语句的返回地址溢出缓冲区,printThis()
因为它们使用不同的堆栈。直觉说,跳转到 print 调用会起作用,但我无法让它起作用。
有什么建议可以获取 GDB 中有效负载所需的信息吗?谢谢你的帮助!
c++ - 暂时禁用分段错误 Ubuntu 14.04
我正在为大学做一些功课,而我正在使用的书(Robert Seacord 的 C 和 C++ 中的安全编码)中有以下示例;
您编写了一个简单的输入密码程序并在程序上执行堆栈粉碎以使终端显示日历快照。作为堆栈粉碎的示例,它非常简单明了。除了我认为我们必须通读的书是很久以前写的,在分段错误涵盖这种活动之前。
我搜索了很多网站(我在 g++ 编译器中添加了 -fno-stach-protector,还设置了 kernel.randomize_va_space=0,这些都不允许执行漏洞代码。
这是密码c ++代码;
这是漏洞利用代码(exploit.bin);
编译密码代码后,我通过输入 ./a.out < exploit.bin 执行
执行时,终端返回“Segmentation fault (core dumped)”。它应该显示的是在“111/usr/bin/cal”中找到的日历快照。
我的问题是,有没有办法暂时禁用此分段错误以允许漏洞代码执行?这将允许我继续做这部分,因为我现在有点难过。
谢谢你,乔恩
编辑:不幸的是,我还不能上传图片,因为我是新手,但这里有一个exploit.bin代码分解的链接;http://imgur.com/lpz9eY4
c - “检测到堆栈粉碎”消息打印到哪个流?
考虑以下非常基本的程序,它在此处以多种形式出现在其他问题上。
在我的系统上,如果我把它放在一个名为 的文件中Classic.c
,不使用特殊标志编译它并运行它,我会得到以下输出。
通常,程序输出到stderr
or stdout
,所以我预计以下不会产生输出。
然而,输出是完全一样的,所以我对这个场景有三个问题。
- 什么流被打印到这里?
- 我怎么能编写打印到这个特殊流的代码(而不是故意破坏我的堆栈)。
- 如何重定向此流的输出?
注意我在 Linux 系统上运行。具体来说,Ubuntu 14.04。
c - Linux 上 C 中的现代堆栈溢出(堆栈粉碎)漏洞利用?
简而言之,我想通过在堆栈上执行所需的地址来做一个简单的、非常基本的利用。
为此,我做了一些研究:
在 linux 上禁用随机化保护:
echo 0 > /proc/sys/kernel/randomize_va_space
编译时在 gcc 上启用 stack exec。
gcc overflow.c -o overflow -mpreferred-stack-boundary=4 -fno-stack-protector -ggdb -z execstack -static
最后创建源代码、gdb和exploit。
无效返回输入(无效){
字符数组[30];获取(数组);printf("%s\n",array); }
诠释主要(){
返回输入();返回 1;}
printf "AAAAAAAAAABBBBBBBBBBCCCCCCCCCC1234567\x40\x10\x5e" | ./overflow
考虑到gdb上的匹配地址,漏洞利用就这么简单
。
最后。我知道这个漏洞“应该”起作用。但我收到以下错误。
16199 illegal hardware instruction (core dumped) ./overflow
我知道该漏洞正在尝试在我传递的地址上实际执行该函数。无论如何它不起作用,系统上有某种保护(Linux 14.04 LTS 更新)但我不知道它是什么。
有谁知道如何克服这种“非法硬件指令(核心转储)”
仅供参考,这是我正在尝试利用的功能的 Gdb disas: