Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 随机大小缓冲区的缓冲区溢出?(获取)_C_Security_Buffer_Buffer Overflow - Fatal编程技术网

C 随机大小缓冲区的缓冲区溢出?(获取)

C 随机大小缓冲区的缓冲区溢出?(获取),c,security,buffer,buffer-overflow,C,Security,Buffer,Buffer Overflow,我正试图了解更多关于如何在我的程序中利用/防止缓冲区溢出的方法。我知道如果大小不变,下面的代码很容易受到攻击,但是如果每次的大小都是随机的呢?是否仍然有办法从堆栈中获取它,并以某种方式动态更改溢出字符的数量 void vulnFunc(int size){ char buffer[size]; gets(buffer); // Arbitrary code } 考虑 fgets(buf,sizeof(buf)-1,stdin) 使用stdin和与缓冲区匹配的大小。这将是

我正试图了解更多关于如何在我的程序中利用/防止缓冲区溢出的方法。我知道如果大小不变,下面的代码很容易受到攻击,但是如果每次的大小都是随机的呢?是否仍然有办法从堆栈中获取它,并以某种方式动态更改溢出字符的数量

void vulnFunc(int size){
    char buffer[size];
    gets(buffer);
    // Arbitrary code
}
考虑 fgets(buf,sizeof(buf)-1,stdin)

使用stdin和与缓冲区匹配的大小。这将是安全的。还有其他的可能性,比如getc(stdin)循环:当数据大于
缓冲区可以是realloc()。

它取决于用于表示数组的变量,如果其类型为char[]或char*。让我解释一下原因:

  • 对于char[],变量名表示数组,
    sizeof
    运算符返回内存中数组的大小(单元格数*sizeof(type)),因此基本上可以使用以下调用获取单元格数:

    sizeof(数组)/sizeof(数组[0])

  • 对于char*,变量是一个指针,它保存数组第一个单元格的值,在这种情况下,sizeof(array)将返回内存中指针的大小,对于64位体系结构,指针的大小为8字节,它与数组无关,因此您无法从此类变量获取信息。也许您可以将分配的缓冲区大小存储在内存中,但我不知道它是否适合您的需要


  • 如果您还动态分配,则可以使用
    sizeof
    运算符获取大小,并相应地更改内容。可能很难控制溢出覆盖的位置/内容,但通过提供比传递给函数的随机数更大的输入,仍有可能在缓冲区后占用内存。你还是。