我正在阅读一些有关安全编程的材料,当我输入时: ./a.out%.622496x%.622496x%n
./ a.out%.. 622496x%n
./ a.out%.633x%.63336x%n
./ a.out%.6edd33x%.63336x%n
有些人会得到coredump,有些人不会,不知道为什么打印全0。
这是代码示例。c gcc example.c
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char buffer[512]="";
strncpy(buffer,argv[1],500);
printf(buffer);
return 0;
}
答案 0 :(得分:5)
在显示这样的字符串之前,您必须清理输入。
当您使用%xxx
作为字符串时,printf
将其解释为潜在参数,然后将尝试获取它们,从而进行核心转储。但这会进一步发展,因为这可能意味着通过此机制的安全攻击。在某种程度上,这与SQL注入的C等效。
作为@TypeIA,这样做的正确方法是将buffer
视为格式字符串(printf("%s", buffer)
)的参数,而不是格式字符串本身。这也是为什么某些编译器在创建带有参数( char * format, ... );
(而不是const)的函数时发出警告的原因。