【发布时间】:2021-02-25 22:07:29
【问题描述】:
#include <stdio.h>
char user_name[20] = " ";
char password[20] = " ";
char users[][2][20] =
{ { "root", "98765" },
{ "me", "hello" },
{ "abc", "password" },
{ "", "" }
};
int check_name()
{
int i;
gets(user_name);
gets(password);
for(i=0; users[i][0][0] != 0; i++)
{
if(strcmp(user_name, users[i][0]) == 0 &&
strcmp(password, users[i][1]) == 0)
return 1;
}
return 0;
}
void logon()
{
printf("Welcome! \n");
exit(1);
}
void reject()
{
printf("Connection closed !\n");
printf("Real username: \n");
printf(users[0][0]);
printf("\n");
printf("Real password: \n");
printf(users[0][1]);
printf("\n");
exit(0);
}
main()
{
if(check_name())
logon();
else
reject();
}
大家好,我有点理解缓冲区溢出背后的理论,但我似乎无法在这里发挥作用。
请注意,我添加了额外的printf 以输出真实的用户名和密码,以查看我在内存中覆盖了多少。
我试着写一封随机的信x。
首先我做了:用户名 = 20 xs,密码 = 60 xs,输出是:
Real user:
xxxxxxxxxxxxxxxxxxxxxxxxxxxx // 28 x's
Real pass:
xxxxxxxx // 8 x's
所以我在密码中添加了 12 xs 以使其最大大小为 20,因此密码 = 72 xs 并且输出为:
// with input user = 20 x's and pass = 72 x's
Real user:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // 40
Real pass:
xxxxxxxxxxxxxxxxxxxx // 20
最终我认为通过将我的输入用户名更新为 40 xs 它会起作用,但它没有。输出与最后一个相同(真实用户为 40 x,真实密码为 20 x),但仍然无法“破解”它。
我现在不知道该怎么做。提前致谢!
【问题讨论】:
标签: c buffer-overflow