Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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 snprintf在缓冲区溢出方面是否安全?_C_Buffer Overflow - Fatal编程技术网

C snprintf在缓冲区溢出方面是否安全?

C snprintf在缓冲区溢出方面是否安全?,c,buffer-overflow,C,Buffer Overflow,例如: char *buffer[100]; snprintf(buffer, 512, "%s", argv[1]); 是否可以使用缓冲区溢出来利用它?如果正确使用它,它是安全的 如果按图示使用,绝对不安全512>100因此存在溢出错误 snprintf只能遵守正确告知的限制。作为一名C程序员,正确匹配这些限制是您的工作 最重大的挑战之一是确保这些信息是一致的,更重要的是,不容易弄乱。如果可能的话,你应该尽量让错误变得更明显、更直观 在这种情况下: #定义缓冲区大小512

例如:

char *buffer[100];
snprintf(buffer, 512, "%s", argv[1]);

是否可以使用缓冲区溢出来利用它?

如果正确使用它,它是安全的

如果按图示使用,绝对不安全<代码>512>100因此存在溢出错误

snprintf
只能遵守正确告知的限制。作为一名C程序员,正确匹配这些限制是您的工作

最重大的挑战之一是确保这些信息是一致的,更重要的是,不容易弄乱。如果可能的话,你应该尽量让错误变得更明显、更直观

在这种情况下:

#定义缓冲区大小512
字符缓冲区[缓冲区大小];
snprintf(缓冲区,缓冲区大小,“%s”,argv[1]);

在您的示例中,您定义了指向
char
的100个指针的数组。在64位系统上,它将有800字节长,足够容纳512个字符

是否有可能利用缓冲区溢出进行攻击


如果程序员故意允许、滥用、对语言不够了解或只是粗心大意,每种语言都可能被利用,而这正是您试图做的(在64位系统上没有成功)。

安全性取决于您作为参数传递给函数的数字。基本上,如果您按照发布为示例的方式进行操作,您将遇到麻烦,并且您的代码将难以维护(使用纯文本)。在我看来,最好的方法是:

#define BUFFER_SIZE 4096 /* for example */
char buffer[BUFFER_SIZE];

snprintf(buffer, sizeof buffer, "format...", parameters);
由于缓冲区大小数字仅在一个位置定义,如果更改它,则不需要逐个变量,检查是否需要到处更新数字


在您的代码中,您声明了一个指向char的指针数组,稍后将其用作字符缓冲区,使用不同的数字作为缓冲区的大小,并且您正在混合与彼此无关的类型。在
char[]
中存储字符,而在
char(*)[]
中存储指向字符的指针(这是您定义的)

如果您正确使用它,您的意思是
char buffer[100]
大概。当在出现
snprintf
的同一范围内声明缓冲区时,最好的做法是
snprintf(buffer,sizeof buffer,…)
这取决于您处理的是
char buffer[N]
还是
char*buffer=malloc(N)
情况。@user3386109:如果您决定替换
char buffer[SIZE];
char*buffer=malloc(SIZE)则容易出错
@tadman确实如此。我会记住其他合适情况下的YOLO模式;-)
snprintf(缓冲区,缓冲区大小,“%s”,argv[1])
是实现安全性的良好第一步,但如果不检查返回值,则安全性是不完整的。关于您的第二句话,在Cray XMP上您将没有空间,因为与其他所有基本类型一样,a
char
是64位的。