[英]Lack of understanding of security engineering in simple C code
我对 C 编程完全陌生。 目前我正在为我的新课程 IT 安全做准备。 在稍早的考试中,我发现了一项我无法解决的任务。 任务是德语的。 原则上,它是关于发现关键错误。
没有写传递参数的样子。
1)我已经说到你不应该使用strcpy
因为它没有边界检查。
2) 如果要存储 10 个字符 (\0),也不应使用char[10]
。 它应该是 char[11]。
是否可以通过 printf(argv[1]) 命令读取地址或写入某物?
我想再次提一下,您亲自在这里帮助我,而不是帮助在大学里收集积分。
#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 、 Electric Fence )来提供与边界检查相关的调试帮助,但由于它们施加的限制,它们通常不被合并到交付的软件中。
你绝对应该使用strcpy()
如果
你知道你的源是一个以 NUL 结尾的字符数组,也就是“一个字符串”,并且
你知道你的目的地足够大,可以容纳所有的源数组,包括终止的 NUL
因为允许编译器编写者使用编译器用户无法使用的幕后技巧,以确保strcpy()
具有最佳性能,同时仍提供标准所保证的行为。
如果要存储 10 个字符 (\0),则不应使用 char[10]
正确的。
要存储 10 个字符和终止 NUL ( '\0'
),您必须至少有 11 个字符的可用空间。
是否可以通过 printf(argv[1]) 命令读取地址或写入某物?
原则上:也许。
printf()
的第一个参数是一个格式字符串,由printf()
解释以确定进一步的 arguments 提供了什么。 如果格式字符串包含任何格式规范(例如"%d"
或"%n"
),则printf()
将尝试检索相应的 arguments。 如果它们实际上没有传递给它,那么它会调用未定义的行为,这是不好的。 攻击者可以运行你的程序,给它一个包含格式说明符的命令行参数,这将导致这样的 UB。
使用printf()
打印这样的任意字符串的正确方法是printf("%s", argv[1]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.