C 如何使用SIGSEGV而不是SIGABRT退出?
我正在学习如何使用此代码导致缓冲区溢出。 然后我用GDB运行它,当我输入导致堆栈崩溃的坏数据时,我退出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
程序收到信号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的答案