我正在学习如何使用此代码导致缓冲区溢出。
然后我用 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.
但我正在阅读的两个指南都是SIGSEGV
或EXC_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;
}
答案 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。