C 为什么可以';我不能禁用堆栈保护吗?

C 为什么可以';我不能禁用堆栈保护吗?,c,buffer,buffer-overflow,exploit,C,Buffer,Buffer Overflow,Exploit,我目前使用的操作系统是64位Ubuntu 14.04,gcc版本为4.8.4 我编写了一个如下所示的简单程序来进行一些与缓冲区溢出相关的测试,不知怎的,我发现我无法正确地溢出本地字符串 /*test.c*/ #include <stdlib.h> #include <stdio.h> #include <string.h> int bof(char *str) { char buffer[4]; strcpy(buffer, str);

我目前使用的操作系统是64位Ubuntu 14.04,gcc版本为4.8.4

我编写了一个如下所示的简单程序来进行一些与缓冲区溢出相关的测试,不知怎的,我发现我无法正确地溢出本地字符串

/*test.c*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[4];
    strcpy(buffer, str);
    return 1;
}

int main()
{
    char str[]="123456789012345'; 

    /* This is the maximum length the string
     can be, which is 16 bytes including the null character at the end, and 
    any strings that are longer than this would result in a segmentation fault */

    bof(str);
}
所以应该禁用所谓的堆栈保护

根据我的观察,任何长度小于或等于16个字符(包括空字符)的字符串都可以;否则,将导致分段错误


你有没有想过我为什么和怎样才能让它工作?提前谢谢

您可以使用GNU Debug来查找距离,下面是一个教程

访问数组超出范围是未定义的行为,因为它脱离了C标准。想想“未定义”这个词的意思。谢谢你的评论。我知道访问越界地址是一种未定义的行为,至少我认为我是这样做的。如果我错了,请纠正我的错误,但越界地址是否本质上是一些存储可以访问和修改的内存块的数据?因此,如果我已经启用了堆栈保护,理论上这将使我能够处理那些越界的地址,并且如果我足够仔细地保持代码的一致性,我是否能够很好地利用这些内存?如果您尝试访问的堆栈元素没有映射到进程的当前地址空间,你到底希望发生什么?除了信号?为什么?您当前的问题不是堆栈保护;如果按照您所说的方式编译,堆栈保护将被禁用。当前发生的情况是,EIP指向一个无效地址(正如EJP所说,该地址未映射到进程的当前地址空间)。如果您尝试使用正确的外壳代码运行它,您的攻击应该会起作用。@glenjoker-我发现很幸运,插入恶意代码很困难。:-)即使我知道如何使用gdb,我也不愿意公开这些信息。当然,我一直在考虑学习如何使用gdb,谢谢你的链接。至于从返回地址额外偏移的8个字节,我对此不太熟悉,但我认为Ubuntu是x86体系结构?我的意思是Ubuntu是x86体系结构,但N32和N64是用于MIPS的,根据维基百科页面,你是对的,如果你使用64位Ubuntu,那么你的处理器是x64。我不知道为什么会有这个8字节的间隙,但是当你阅读关于缓冲区溢出的教程时,会发现返回地址不能准确确定(当不使用gdb时),你应该使用NOPs和试错法,见第页。4(德语)本教程很好:要完成此教程,缓冲区[]是溢出的缓冲区,但是必须填充str[],直到覆盖返回地址。返回地址的位置可以由GDB确定,也可以通过试错。。。
gcc -o test -fno-stack-protector test.c