我正在阅读一些有关安全编程的 Material ,当我输入: ./a.out%.622496x%.622496x%n
./a.out%..622496x%n
./a.out%.633x%.63336x%n
./a.out%.6edd33x%.63336x%n
有些会得到 coredump,有些不会,不明白为什么他们打印所有 0。
这是代码示例.c gcc 示例.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;
}
最佳答案
在显示这样的字符串之前,您必须清理输入。
由于 %xxx
是字符串,printf
将它们解释为潜在的参数,然后尝试获取它们,从而产生核心转储。但这更进一步,因为这可能意味着通过这种机制进行安全攻击。在某种程度上,这相当于 SQL 注入(inject)的 C 语言。
作为@TypeIA,正确的方法是将buffer
视为格式化字符串的参数(printf("%s", buffer)
),不是格式化字符串本身。这也是为什么如果您创建带有参数 ( char * format, ... );
(不是 const)的函数,一些编译器会发出警告的原因。
关于c - printf 有问题或者什么的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275492/