我正在尝试制造缓冲区溢出,以下是我的代码:
从命令行提供的密码将与“brilling”和“outgrabe”进行比较,如果用户输入与这些任何一个匹配,则将授予访问权限,否则将被拒绝。据我所知,如果提供的密码大于16个字节,则返回地址将被覆盖,但是当我输入“A” 17时,它没有被覆盖。相反,auth_flag被覆盖并为65(十六进制中的0x41,即A)。我无法弄清楚为什么变量被覆盖而不是返回地址。我使用以下命令进行编译:gcc -fno-stack-protector -z execstack -g -o test test.c。希望你们能帮忙解决问题。谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;
strcpy(password_buffer, password);
if(strcmp(password_buffer, "brillig") == 0)
auth_flag = 1;
if(strcmp(password_buffer, "outgrabe") == 0)
auth_flag = 1;
return auth_flag;
}
int main(int argc, char *argv[]) {
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("\nAccess Denied.\n");
}
}
从命令行提供的密码将与“brilling”和“outgrabe”进行比较,如果用户输入与这些任何一个匹配,则将授予访问权限,否则将被拒绝。据我所知,如果提供的密码大于16个字节,则返回地址将被覆盖,但是当我输入“A” 17时,它没有被覆盖。相反,auth_flag被覆盖并为65(十六进制中的0x41,即A)。我无法弄清楚为什么变量被覆盖而不是返回地址。我使用以下命令进行编译:gcc -fno-stack-protector -z execstack -g -o test test.c。希望你们能帮忙解决问题。谢谢!