我对C编程绝对是个新手。目前,我正在为新的IT安全课程做准备。在一次稍老的考试中,我发现了一项我没有办法解决的任务。这项任务是德语的。原则上,它是关于发现关键错误。
它没有写传递的参数的样子。
1( 我已经指出,您不应该使用strcpy
,因为它没有边界检查。
2( 此外,如果要存储10个字符(\0(,则不应使用char[10]
。它应该是char[11]。
由于printf(argv[1](命令,有可能阅读Adress或写某事吗?
我想再次提到,你在这里亲自帮助我,而不是帮助在大学里收集加分。
#include <stdio.h>
int main(int argc, char *argv[])
{
char code[10];
if(argc != 2) return 1;
printf(argv[1]);
strcpy(code, "9999999999");
for(int i = 0; i < 10; ++i){
code[i] -= argv[1][i] % 10;
}
printf(", %sn", code);
return 0;
}
请参阅相关的
您不应该使用strcpy((,因为它没有边界检查
C中的任何东西都没有边界检查,除非
-
编译器编写器将其放在那里,或
-
你把它放在那里了。
很少有编译器编写器在其产品中包含边界检查,因为这通常会导致生成的代码更大、更慢。存在一些工具(例如。Valgrind,电动围栏(以提供与边界检查相关的调试帮助,但由于它们的局限性,它们通常不包含在交付的软件中。
如果,您绝对应该使用strcpy()
-
您知道您的源是一个NUL终止的字符数组,也称为"字符串"、和
-
您知道您的目的地足够大,可以容纳所有源阵列,包括终止NUL
因为编译器编写器被允许使用编译器用户无法使用的幕后技巧,以确保strcpy()
具有尽可能好的性能,同时仍然提供标准所保证的行为。
char[10]
正确
要存储10个字符和终止NUL(' '
(,必须至少有11个字符的可用空间。
由于printf(argv[1](命令,是否可以读取地址或写入某物?
原则上:也许。
printf()
的第一个自变量是一个格式字符串,printf()
对其进行解释以确定已经提供了哪些进一步的自变量。如果格式字符串包含任何格式规范(例如"%d"
或"%n"
(,则printf()
将尝试检索相应的参数。如果它们实际上没有被传递给它,那么它就会调用"未定义的行为",这是坏的。攻击者可以运行您的程序,并为其提供包含格式说明符的命令行参数,这将导致此类UB。
用printf()
打印这样的任意字符串的正确方法是printf("%s", argv[1]);