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

问题描述 投票:0回答:1

我对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;
}
c security
1个回答
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]);

© www.soinside.com 2019 - 2024. All rights reserved.