缓冲区溢出:以十六进制写入7而不使用“空终止符”(0x00)

时间:2016-12-01 22:20:21

标签: c hex buffer-overflow

我正在尝试利用缓冲区溢出漏洞来覆盖堆栈的返回地址。

然而,我试图“破解”的代码使用了金丝雀系统。它始终将一个整数初始化为相同的硬编码值7,并检查以后该变量是否仍然相同。

我可以创建一个缓冲区溢出,我可以写这个变量,但是我在编写正确的值时遇到了麻烦。缓冲区溢出是由错误使用strcpy引起的。输入是通过文件的内容给出的,如下所示:

0000000: 6132 3334 3536 3738 395f 6232 3334 3536  a23456789_b23456
0000010: 3738 3907 00                             789..

最后2个十六进制值(07 00)是我遇到麻烦的地方。 07是我试图放在变量中的值(它被放置在正确的内存位置)。但是我相信我需要在下一个位置写00,否则变量的值大于7。

00的问题在于它作为strcpy的空终止符,这意味着我不能再提供它后面的信息,因此不能覆盖返回地址。

这种情况是否可以克服,或者在不使用0x00的情况下提供正确的值是不可能的?

编辑:

代码(大部分缩写为点):

void getwd(char *path)
{
  strcpy( path, mapped_path );
  return path;
}

void pwd(void)
{

  int canary = 7;
  char path[MAXPATHLEN + 1];

  if (getwd(path) == (char *) NULL)
  {
    printf("Couldn't get current directory!\n");
  }
  else
  {
    printf("Current directory = %s\n", path);
    printf("max strlen(path) is %d, strlen(path) = %d\n", MAXPATHLEN-1, strlen(path));
    printf("Canary should be 7.  Canary = %d\n", canary);
    if (canary != 7)
      printf("ALERT: path[MAXPATHLEN + 1] has been overflowed!\n");
  }
}

缓冲区溢出发生在getwd中,其中mapped_pa​​th大于path。此时的mapped_pa​​th可以包含您想要的任何值。

1 个答案:

答案 0 :(得分:1)

您必须注入实际的shellcode,以编程方式在整个特定位置插入整数7.

第一步是找到返回地址并将其设置为缓冲区中的特定位置。

第二步是在预定义的位置放置一个零自由的shellcode,让shellcode再次将变量设置为7。

零自由shellcode并不难写,因为有很多可能的方法可以在不使用像xor eax, eax这样的实际数字的情况下将变量归零(如果你熟悉汇编)。

如果您以前从未这样做过,那么实现这一目标可能需要很长时间。