【问题标题】:How to 'hack' with buffer overflow attack如何“破解”缓冲区溢出攻击
【发布时间】: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


【解决方案1】:

您必须了解 C 中字符串的构成。像 printf 这样的东西会继续从字符串中打印字节,直到遇到 NULL 字符。以您的方式 (foo="barbaz") 在程序中嵌入字符串会自动包含一个空字符。

当程序将字符串读入固定长度的缓冲区,但输入大于缓冲区时,会发生缓冲区溢出错误。例如,如果我有char username[8],但用户输入了supercalifragilisticexpalidocious

显然,输入大于缓冲区,如果程序允许所有输入,它将继续覆盖内存中超出用户名的任何内容。

在这种情况下,足够聪明的黑客可以覆盖内存,让她可以访问她通常无法访问的部分程序或数据。

所以,为了回答您的问题,由于您是如何使用完全在代码的已编译部分中定义的字符串来构建程序的,因此您不会出现缓冲区溢出错误。

尝试接受无限制的用户输入,然后放入比缓冲区可以接受的更多的数据,看看生成的内存块会发生什么。

【讨论】:

  • Nit(技术上是一个nul-character)见ASCII Table and DescriptionNULL是一个指针。
  • 您好,感谢您的回答。源代码作为学校作业提供给我们,我只添加了“printf”命令来输出 users 数组的状态并查看“真实”用户名和密码是什么。至少根据我们的任务,它应该是“容易破解”的缓冲区溢出。正如我所提到的,我设法覆盖了“用户”数组的原始内容。我只是在玩我需要输入多少个“x”才能让它工作。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2016-06-06
  • 2019-04-14
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多