缓冲区溢出 c(gets 函数)
buffer overflow c(gets function)
有以下代码,我需要return一个低于0x30且不等于0或2的访问级别:
int login() {
int accessLevel = 0xff;
char username[16];
char password[32];
printf("Username (max 15 characters): ");
gets(username);
printf("Password (max 31 characters): ");
gets(password);
if (!strcmp(username, "admin") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 2;
} else if (!strcmp(username, "root") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 0;
} else if (!strcmp(username, "artist") && !strcmp(password, "my-password-is-secret")) {
accessLevel = 0x80;
}
return accessLevel;
}
我输入了用户名 16 'a' 将 accessLevel 重置为 0(然后添加 space 将访问权限设置为 20 并为我提供了所需的输出)。
但是,我希望缓冲区覆盖密码,而不是 accessLevel,因为它是 "following memory"。
我想我误解了缓冲区的工作原理并希望得到解释。
另外,为什么第16个字符重置为0?
提前致谢!
Strcmp 将匹配任意数量的字符,由空终止字符的第一个实例给出。所有字符串文字必须以 \0
结尾
使用 strncmp 只会比较参数中给出的字符数量
局部变量在堆栈上的排序(假设是一个堆栈)不保证是任何特定的顺序。它在很大程度上取决于变量的类型和每个变量所需的对齐方式,并且可能会根据编译器或优化设置而改变。
在这种情况下,听起来变量是按照它们在代码中出现的顺序被压入堆栈的,这意味着它们的地址会逐渐减少。
有以下代码,我需要return一个低于0x30且不等于0或2的访问级别:
int login() {
int accessLevel = 0xff;
char username[16];
char password[32];
printf("Username (max 15 characters): ");
gets(username);
printf("Password (max 31 characters): ");
gets(password);
if (!strcmp(username, "admin") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 2;
} else if (!strcmp(username, "root") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 0;
} else if (!strcmp(username, "artist") && !strcmp(password, "my-password-is-secret")) {
accessLevel = 0x80;
}
return accessLevel;
}
我输入了用户名 16 'a' 将 accessLevel 重置为 0(然后添加 space 将访问权限设置为 20 并为我提供了所需的输出)。 但是,我希望缓冲区覆盖密码,而不是 accessLevel,因为它是 "following memory"。 我想我误解了缓冲区的工作原理并希望得到解释。 另外,为什么第16个字符重置为0?
提前致谢!
Strcmp 将匹配任意数量的字符,由空终止字符的第一个实例给出。所有字符串文字必须以 \0
结尾使用 strncmp 只会比较参数中给出的字符数量
局部变量在堆栈上的排序(假设是一个堆栈)不保证是任何特定的顺序。它在很大程度上取决于变量的类型和每个变量所需的对齐方式,并且可能会根据编译器或优化设置而改变。
在这种情况下,听起来变量是按照它们在代码中出现的顺序被压入堆栈的,这意味着它们的地址会逐渐减少。