C 如何使用SIGSEGV而不是SIGABRT退出?

C 如何使用SIGSEGV而不是SIGABRT退出?,c,gdb,signals,stack-overflow,C,Gdb,Signals,Stack Overflow,我正在学习如何使用此代码导致缓冲区溢出。 然后我用GDB运行它,当我输入导致堆栈崩溃的坏数据时,我退出 程序收到信号SIGABRT,中止。 0x00007FF7A4AF79英寸GI上升(信号=sig@entry=6) 位于../nptl/sysdeps/unix/sysv/linux/raise.c:56 56../nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。 但是,我正在阅读的两个指南都带有SIGSEGV或EXC\u BAD\u ACCESS

我正在学习如何使用此代码导致缓冲区溢出。 然后我用GDB运行它,当我输入导致堆栈崩溃的坏数据时,我退出
程序收到信号SIGABRT,中止。
0x00007FF7A4AF79英寸GI上升(信号=sig@entry=6)
位于../nptl/sysdeps/unix/sysv/linux/raise.c:56
56../nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。
但是,我正在阅读的两个指南都带有
SIGSEGV
EXC\u BAD\u ACCESS
以及原因(在最后一种情况下)
KERN\u INVALID\u ADDRESS
和实际上是错误输入的地址

我如何带着这些信号离开?是我的系统配置成这样工作的吗

我在Ubuntu 14.04 LTS Trusty上运行

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int test(char *test) {
    char buf[10];
    strcpy(buf, test);

    return 0;
}

int main(int argc, char *argv[]) {
    test(argv[1]);
    printf("After test: %s\n", argv[1]);

    return 0;
}
#包括
#包括
#包括
int测试(字符*测试){
char-buf[10];
strcpy(buf,测试);
返回0;
}
int main(int argc,char*argv[]){
试验(argv[1]);
printf(“测试后:%s\n”,argv[1]);
返回0;
}

您的编译器似乎实现了堆栈破坏保护,以防止缓冲区溢出。使用
-fno stack protector
标志编译。

编译c文件时,需要禁用-fstack protector

像这样编译:

gcc yourFileName.c -o yourFileName -fno-stack-protector
在您的情况下,它将是
gcc-raise.c-o-raise-fno堆栈保护器
然后使用
GDB./raise
与GDB一起运行。然后,您可以通过运行以下命令立即溢出缓冲区

run $(python –c “print(‘F’*32)”) 

这将溢出您的
字符buf[10]
将32个“F”字符放入
buf[10]
。这将导致显示SIGSEGV分段故障。

对我有效;复制/粘贴您的程序,在gdb中运行时给我:“程序收到信号SIGSEGV,分段错误。”(Ubuntu 14.10)@nlu。在矿井里没有。不在gdb中,也不在终端。我不知道这是否有用,但我在Thinkpad T440上运行,在他们的BIOS中有一些关于防止缓冲区溢出的配置。它对什么有影响吗?参见@Arjun Sreedharan的答案