是否可以在不输入字符串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;
}
答案 0 :(得分:1)
在此版本中,以下代码不会检查fgets()
的返回值(这是一个漏洞利用开放),但却使用password
。这产生了可能用于破解的问题。使用正确的密码说出上一代代码。现在通过此运行,恶意用户会导致IO错误fgets()
返回NULL
。 passwd
的内容不确定,可能是之前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到9个字符,则puts()函数可以正常工作。如果输入10个字符,则不打印任何内容。
答:那是因为你要覆盖你的阵列。缓冲区溢出。 Undefined behavior
从不使用&#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'
。