c - 缓冲区溢出: writing 7 in hexadecimal without 'null terminator' (0x00)

标签 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可以保存你想要的任何值。

最佳答案

您必须注入(inject)实际的 shellcode,以编程方式在此特定位置插入整数 7。

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

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

无零 shellcode 并不难编写,因为有许多可能的方法可以将变量清零,而无需使用实际数字,例如 xor eax, eax(如果您熟悉汇编)。

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

关于c - 缓冲区溢出: writing 7 in hexadecimal without 'null terminator' (0x00),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921455/

相关文章:

c++ - Leetcode 1366:堆缓冲区溢出

c - 引用调用的内部工作原理

c - 在 C 中实现分层状态机

c - UDP Echo 服务器未在客户端上接收

java - 将 int 转换为十六进制字节值

C++使数字以十六进制形式出现

Flutter:将 RGB 值转换为十六进制 int

c++ - C++ 字符串中会发生缓冲区溢出吗?

c - 在 Cygwin 中使用 NCurses 扫描 USB 设备的输入

c - 我如何利用缓冲区溢出?