繁体   English   中英

实际尝试引发分段错误时“检测到堆栈粉碎”

[英]Getting "stack smashing detected" when actually trying to provoke a segmentation fault

我目前正在学习 c 中的缓冲区溢出,我正在关注这个视频作为教程。

所以我有以下代码:

#include <stdio.h>
include <string.h>
int main(int argc, char *argv[]){ 
char buf[256];
 strcpy(buf, argv[1]); 
printf("%s,", buf); 
return 0; 
}

我编译它的方式应该禁用 aslr $ gcc buf.c -o buf -no-pie -fno-PIE 然后我使用 gdb 找到我想要定位的缓冲区的位置。 之后,我尝试通过在程序中输入太大的字符串来查看是否可以引发分段错误:

(gdb) run $(python3 -c "print('A'*265)")
Starting program: /home/ask/Notes/ctf/bufoverflow/code/buf $(python3 -c "print('A'*265)")
*** stack smashing detected ***: terminated

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

就像我预期的那样,这会导致程序因错误而终止。 但是,在我一直在看的视频中,这种行为引发的错误是Segmentation fault(SIGSEGV) 当我查看这两个错误时,我得到堆栈粉碎错误是有道理的,因为我超出了堆栈的范围。

似乎在 SIGSEGV 错误甚至被击中之前就引发了堆栈粉碎。

所以我的问题是,为什么一个例子会出现一个错误,而我却得到另一个? 这可能与我正在运行它的机器有关,它上面有哪些保护设置,还是有其他原因?

堆栈粉碎是当您覆盖函数堆栈帧上的特殊值(返回地址、先前的ebp寄存器值)时。
这是一个常见的错误,是一个安全漏洞。 大多数编译器现在在您的 function 序言和尾声中添加一个简单的检查,以检查值是否更改。 这是您导致的堆栈粉碎错误。
要防止 copmiler 插入堆栈粉碎检查,请使用-fno-stack-protector编译器标志。 (正如@Grazosi建议的那样)。
这将导致您的程序使用(可能)无效的返回地址,并将导致分段错误(无效的 memory 访问)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM