【问题标题】:Buffer Overflow缓冲区溢出
【发布时间】:2015-12-16 07:58:05
【问题描述】:

我已经在网上搜索了几天,但仍然无法弄清楚以下代码的漏洞是什么。 我的第一个想法是我们可以对 int 'length' 进行溢出,然后进行缓冲区溢出利用来复制 shell 代码并将地址返回到缓冲区。然而,代码中的“长度”大小正在防止缓冲区溢出。任何人都可以阐明如何利用这个程序吗?非常感谢!

void copy_str(char *buffer2, int buffer2_l, char *input)
{
   int i, length;

   length = strlen(input);
   if (length > buffer2_l)
     length = buffer2_l;

   for (i = 0; i <= **length**; i++)
       buffer2[i] = input[i];
}

void vul2(char *arg)
{
  char buffer[109];

  copy_str(buffer, sizeof buffer, arg);
 }

void vul1(char *argv[])
{
   vul2(argv[1]);
}
int main(int argc, char *argv[])
{
  if (argc != 2)
    {
      fprintf(stderr, "program2: argc != 2\n");
      exit(EXIT_FAILURE);
    }
  vul1(argv);
  return 0;
}

【问题讨论】:

  • 提示:如果argv[1] 的长度为200 个字符,那么将多少字节复制到buffer 中? for 循环执行了多少次迭代? (如果没有看到,请尝试将buffer 更改为char buffer[1]。)
  • 您好,感谢您的回复。我的理解是,如果 argv[1] 长度为 200 个字符,则只会将 109 个字节复制到缓冲区,for 循环将执行 109 次。在这种情况下没有缓冲区溢出。所以这里的问题是如何通过这样的长度检查编写预期的 shell 代码并将地址返回到缓冲区?
  • 查看此视频为 Georgia Weidman vimeo.com/33106013

标签: c buffer-overflow integer-overflow strlen


【解决方案1】:

如果 argv[1] 是 109 个字符或更长,您将超出 buffer 1 个 char,因为您使用 &lt;= 进行长度比较。

【讨论】:

  • 嗨,如果只能覆盖一个字节?它对漏洞利用有何帮助?
  • @kevin 这是未定义的行为,意味着任何事情都可能发生。实际上,该字节可能恰好是返回地址的一部分。虽然不太可能单独使用,但这可能会使单独的漏洞变得可行,例如允许攻击者将可执行页面添加到目标进程但实际上无法跳转到它的漏洞。大多数现实世界的漏洞利用组合使用看似孤立无害的漏洞。
猜你喜欢
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2013-11-06
  • 2013-04-11
  • 2015-07-07
  • 2012-02-05
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多