是否可以在此c程序中破解密码?

时间:2015-08-22 18:11:16

标签: c passwords

是否可以在不输入字符串Password cracked作为输入的情况下打印Password。即使输入的输入不是Password,是否存在可以设置标志的内存泄漏或意外行为。

#include<stdio.h>
#include<string.h>
int main()
{
  int flag = 0;
  char passwd[10];
  char password[10];

  memset(passwd,0,sizeof(passwd));
  fgets(password, sizeof password, stdin);
  strcpy(passwd, password);

  if(0 == strcmp("Password", passwd)) {
    flag = 1;
  }

  if(flag) {
    printf("\n Password cracked \n");
  }
  else {
    printf("\n Incorrect passwd \n");

  }

  return 0;
}

4 个答案:

答案 0 :(得分:1)

OP已经第二次做了重大编辑 - 更好地开始一个新问题。 @ J.Selva,不要再改变这个问题了。

在此版本中,以下代码不会检查fgets()的返回值(这是一个漏洞利用开放),但却使用password。这产生了可能用于破解的问题。使用正确的密码说出上一代代码。现在通过此运行,恶意用户会导致IO错误fgets()返回NULLpasswd的内容不确定,可能是之前fgets()来电的值。 memset()在此处没有帮助,因为它清除passwd而不是fgets()用于分配password的内部缓冲区。

memset(passwd,0,sizeof(passwd));
fgets(password, sizeof password, stdin);
strcpy(passwd, password);

正确的代码将使用

// memset not needed
// memset(passwd,0,sizeof(passwd));

if (fgets(password, sizeof password, stdin) == NULL) {
  Handle_EOForInputError();
  return -1;
}
strcpy(passwd, password);

答案 1 :(得分:0)

  1. 问:如果输入包含1到9个字符,则puts()函数可以正常工作。如果输入10个字符,则不打印任何内容。

    答:那是因为你要覆盖你的阵列。缓冲区溢出。 Undefined behavior

  2. 从不使用&#34; gets()&#34;。 始终使用fgets()代替。正是出于这个原因:

    http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1049157810&id=1043284351

答案 2 :(得分:0)

整个事情将取决于缓冲区的溢出,从而取决于未定义的行为。

答案 3 :(得分:0)

OP更新了将gets()替换为fgets()的帖子。现在代码错误地使用了fgets(),因此它可能会出现未定义的行为。

即使fgets(password)替换为fgets(password, sizeof password, stdin),仍然存在未检入fgets() /

结果的问题

如果用户输入"Password",则输出肯定是"\n Incorrect passwd \n",因为passwd肯定会保留'\n'