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

时间:2015-03-15 16:20:18

标签: c gdb signals stack-overflow

我正在学习如何使用此代码导致缓冲区溢出。 然后我用 GDB 运行它,当我输入导致粉碎堆栈的坏数据时我退出 Program received signal SIGABRT, Aborted. 0x00007ffff7a4af79 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 但我正在阅读的两个指南都是SIGSEGVEXC_BAD_ACCESS退出的原因(在最后一种情况下)KERN_INVALID_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;
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

像这样编译:

gcc yourFileName.c -o yourFileName -fno-stack-protector

在您的情况下,它将是gcc raise.c -o raise -fno-stack-protector 然后使用gdb ./raise与GDB一起运行。然后,您可以通过运行

之类的内容立即溢出缓冲区
run $(python –c “print(‘F’*32)”) 

通过放置32&#39; F&#39;这将使char buf[10];溢出。将字符转换为buf[10]。这将导致显示SIGSEGV,Segmentation fault。