C++ 缓冲区溢出、strcpy、fgets、sprintf 显示运行时错误
C++ Buffer Overflow, strcpy, fgets, sprintf showing runtime error
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char* password) {
int auth_flag = 0;
char* password_buffer;
char* dept;
password_buffer = (char*)malloc(16);
dept = (char*)malloc(10);
printf("Your department?");
fgets(dept, 10, stdin); //line 11
strcpy_s(password_buffer, 16, password); //line 12
if (strcmp(password_buffer, "AsiaPacificInst") == 0) {
if (strcmp(dept, "NSF") == 0) {
auth_flag = 1;
}
}
if (strcmp(password_buffer, "AsiaPacificUni") == 0) {
if (strcmp(dept, "TM") == 0) {
auth_flag = 1;
}
}
return auth_flag;
}
int main(int argc, char* argv[]) {
char errmsg[512];
char outbuf[512];
char user[20];
printf("Username: ");
fgets(user, 20, stdin); //line 32
if (strcmp(user, "Adm1n") == 0) {
printf("Authorised User\n"); sprintf_s(errmsg, "Authorised User %400s", user); sprintf_s(outbuf, errmsg); //line 34
if (argc < 2)
{
printf("Usage: %s <password>\n", argv[0]); exit(0);
}
if (check_authentication(argv[1]))
{
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" Access Granted.\n");
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
}
else {
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf("\nAccess Denied.\n");
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
}
}
else { printf("Unauthorised User!!\n"); exit(0); }
}
由于我不熟悉 C++,我需要帮助检查下面的代码集是否以正确的方式编写。
- fgets(第 11 和 32 行)
- strcpy_s(第 12 行)
- sprintf_s(第 34 行)
因为这行代码在我从其他来源获取时有错误。但是,我在 运行 程序无法正常运行时修复了这些错误。该程序实际上应该请求用户名和密码,并使用用户名验证用户是否获得授权,并使用密码验证用户所在的部门。但是,我只能在 运行 程序时输入用户名。它没有要求我输入密码。总的来说,是否还有任何其他问题可能导致程序无法正常 运行。
Program Result when executed
程序不请求密码,因为它希望它作为参数传递,如下所示:'c:\yourapp.exe yourpass'。如果你想让它请求密码,你应该稍微修改一下。
在主函数的 if (check_authentication(argv[1]))
行之前添加以下行。
char password[16];
printf("Password: ");
fgets(password, 16, stdin);
将行 if (check_authentication(argv[1]))
替换为 if (check_authentication(password))
并删除或注释掉以下行:
if (argc < 2)
{
printf("Usage: %s <password>\n", argv[0]); exit(0);
}
最后请不要忘记在每次 fgets
调用后删除换行符。
Removing trailing newline character from fgets() input
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char* password) {
int auth_flag = 0;
char* password_buffer;
char* dept;
password_buffer = (char*)malloc(16);
dept = (char*)malloc(10);
printf("Your department?");
fgets(dept, 10, stdin); //line 11
strcpy_s(password_buffer, 16, password); //line 12
if (strcmp(password_buffer, "AsiaPacificInst") == 0) {
if (strcmp(dept, "NSF") == 0) {
auth_flag = 1;
}
}
if (strcmp(password_buffer, "AsiaPacificUni") == 0) {
if (strcmp(dept, "TM") == 0) {
auth_flag = 1;
}
}
return auth_flag;
}
int main(int argc, char* argv[]) {
char errmsg[512];
char outbuf[512];
char user[20];
printf("Username: ");
fgets(user, 20, stdin); //line 32
if (strcmp(user, "Adm1n") == 0) {
printf("Authorised User\n"); sprintf_s(errmsg, "Authorised User %400s", user); sprintf_s(outbuf, errmsg); //line 34
if (argc < 2)
{
printf("Usage: %s <password>\n", argv[0]); exit(0);
}
if (check_authentication(argv[1]))
{
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" Access Granted.\n");
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
}
else {
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf("\nAccess Denied.\n");
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
}
}
else { printf("Unauthorised User!!\n"); exit(0); }
}
由于我不熟悉 C++,我需要帮助检查下面的代码集是否以正确的方式编写。
- fgets(第 11 和 32 行)
- strcpy_s(第 12 行)
- sprintf_s(第 34 行)
因为这行代码在我从其他来源获取时有错误。但是,我在 运行 程序无法正常运行时修复了这些错误。该程序实际上应该请求用户名和密码,并使用用户名验证用户是否获得授权,并使用密码验证用户所在的部门。但是,我只能在 运行 程序时输入用户名。它没有要求我输入密码。总的来说,是否还有任何其他问题可能导致程序无法正常 运行。
Program Result when executed
程序不请求密码,因为它希望它作为参数传递,如下所示:'c:\yourapp.exe yourpass'。如果你想让它请求密码,你应该稍微修改一下。
在主函数的 if (check_authentication(argv[1]))
行之前添加以下行。
char password[16];
printf("Password: ");
fgets(password, 16, stdin);
将行 if (check_authentication(argv[1]))
替换为 if (check_authentication(password))
并删除或注释掉以下行:
if (argc < 2)
{
printf("Usage: %s <password>\n", argv[0]); exit(0);
}
最后请不要忘记在每次 fgets
调用后删除换行符。
Removing trailing newline character from fgets() input