我对C语言编程绝对是个新手。目前我正在准备我的新课程学习IT安全。在一个稍旧的考试中,我发现了一个任务,我没有办法如何解决它。这个任务是用德语写的。原则上,它是关于寻找关键错误。
它没有写出通过的参数是怎样的。
1)我得出的结论是,你不应该用 strcpy
因为它没有边界检查。
2)同时 char[10]
如果你想存储10个字符(\0),则不应使用。应该是 char[11]。
是否可以通过printf(argv[1])命令来读取地址或写入sth?
我想再次提到,你在这里帮助我个人,而不是帮助在大学里收集加分。
#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(", %s\n", code);
return 0;
}
你不应该使用strcpy(),因为它没有边界检查功能。
没什么 在C语言中具有边界检查功能,除非
编译者把它放在那里。或
你把它放在那里。
很少有编译器编写者在他们的产品中加入边界检查,因为这通常会导致产生的代码更大更慢。有一些工具存在(例如Valgrind,电动围栏)来提供与边界检查相关的调试帮助,但由于它们所带来的限制,它们通常不会被纳入到交付的软件中。
你绝对可以 应 使用 strcpy()
如果
你知道你的源是一个以NUL结尾的字符数组,也就是 "一个字符串"。和
你知道你的目的地足够大,可以容纳所有的源数组。包括 终止的NUL
因为编译器作者被允许使用编译器无法使用的幕后技巧。用户 以确保 strcpy()
具有最好的性能,同时还能提供标准所保证的行为。
如果你想存储10个字符(\0),就不应该使用char[10]。
正确。要存储10个字符 和 终止的NUL('\0'
),你必须有至少11个字符的可用空间。
是否可以通过printf(argv[1])命令来读取Adresses或写入sth?
原则上:可以。
第一个参数是 printf()
是一个格式字符串,由 printf()
来确定还提供了哪些参数。如果格式字符串包含任何格式规范(如 "%d"
或 "%n"
)则 printf()
将尝试检索相应的参数.如果它们实际上没有被传递给它,那么它就会调用未定义行为,这是坏的.攻击者可以运行你的程序,给它一个包含格式指定符的命令行参数,这将导致这样的UB.
正确的方法是用以下方法打印一个任意字符串 printf()
是 printf("%s", argv[1]);