对简单C代码中的安全工程缺乏理解



我对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()具有尽可能好的性能,同时仍然提供标准所保证的行为。

如果要存储10个字符(\0(,则不应使用

char[10]

正确
要存储10个字符终止NUL(''(,必须至少有11个字符的可用空间。

由于printf(argv[1](命令,是否可以读取地址或写入某物?

原则上:也许。

printf()的第一个自变量是一个格式字符串,printf()对其进行解释以确定已经提供了哪些进一步的自变量。如果格式字符串包含任何格式规范(例如"%d""%n"(,则printf()将尝试检索相应的参数。如果它们实际上没有被传递给它,那么它就会调用"未定义的行为",这是坏的。攻击者可以运行您的程序,并为其提供包含格式说明符的命令行参数,这将导致此类UB。

printf()打印这样的任意字符串的正确方法是printf("%s", argv[1]);

相关内容

  • 没有找到相关文章

最新更新