0

我正在学习 C 并决定使用代码,但无法找出该代码中的漏洞在哪里。

我在这里粘贴了我的代码:

#include <stdio.h>
 
char getPasswd() {
  int trigger = 'K';
  char data[100];
  gets(data);
  return (char) trigger;
}
void login() {
  printf("inside!\n");
  exit(0);
}
void main() {
  printf("enter ");
  if (getdata() == 'G') {
    login();
  } else {
    printf("wrong.\n");
    exit(1);
  }
}

如果需要更多信息,请告诉我。我认为漏洞存在,gets() line 6因为使用它不安全。我是新手,所以不确定是否有任何帮助。

4

2 回答 2

0

该漏洞确实存在于gets函数中。你做:

char passwd[100];
gets(passwd);

在这种情况下,缓冲区长 100 个字节,因此如果有人输入的字符串长度超过 100 个字符,您的 passwd 缓冲区将溢出并可能覆盖存储在该密码之后的一些重要数据。要阻止这种情况发生,您可以使用 (fgets(buffer, sizeof(buffer), stdin);

所以你的一段代码会变成:

char passwd[100];
fgets(passwd, 100, stdin);
于 2020-09-23T10:31:15.483 回答
0

gets()没有边界检查。所以从技术上讲,您可以输入大于 100 字节的密码并破坏堆栈。

例如在我的机器上,我可以输入密码

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

(108 个字符),将(可能)相邻的变量从“F”覆盖trigger到“T”,从而使您的代码打印“登录”消息。

但这在很大程度上取决于您正在运行的平台以及您的编译器等。

于 2020-09-23T10:38:08.147 回答