【问题标题】:Overwriting data via array vulnerabilities通过数组漏洞覆盖数据
【发布时间】:2019-04-13 11:15:10
【问题描述】:

我试图通过数组索引演示缓冲区溢出(当没有任何边界检查时)。我想要做的是通过传入一个错误的值将我的 bool authenticated = false 更改为 true。
我正在使用 GCC 4.8.5

arrayVulnerability(int size)
{
   int array[4];
   bool authenticated = false;

   for (int i = 0; i < size; i++)
   {
      array[i] = size;
   }
}

我的理解是我的记忆是这样设置的:

我希望通过传递大于 4 的 int 能够将该位置覆盖为 true,但它不起作用。我很好奇我的记忆是否被误解或遗漏了什么?

编辑: 我按照建议打印出位置并得到以下信息:

bool authenticated = 0x7ffc4741612f
array[0] = 0x7ffc47416130
array[1] = 0x7ffc47416134
array[2] = 0x7ffc47416138
array[3] = 0x7ffc4741613c
array[4] = 0x7ffc47416140

所以看起来bool authenticated 在我的数组之前并且我的内存布局错误。但是,我仍然对为什么它在我的数组之前感到困惑。

【问题讨论】:

  • arrayauthenticated 的顺序重试。
  • 你试图做的被认为是未定义的行为,这意味着你不能保证在每个平台和编译器上你想要的行为。但是,如果您准确指定您正在使用的编译器,以及您正在编译的目标环境,我们或许能够更直接地回答这个问题。
  • 如果这是发布的真实代码,那么整个函数很可能会被完全优化掉。如果不是这样,请发布一个 - 包括目标系统、编译器和编译器开关。在处理未定义的行为时,每一点都很重要。
  • 您在调试程序时是否尝试检查这些变量的实际地址?
  • that

标签: c++ arrays memory buffer-overflow exploit


【解决方案1】:

最有可能实现的自动存储,堆栈,随着对象的分配而向下增长。这意味着array 被分配了某个地址,然后authenticated 被分配了一个地址。您可以做一些快速实验来验证是否是这种情况。要么查看在之前 array 定义的对象的状态,要么打印对象的地址。

【讨论】:

  • 我按照您的建议打印了位置,您是对的。看起来我正在寻找的项目在数组之前。但是我不确定为什么会这样。
  • @Kirby:有时不是。当您依赖 C++ 保证之外的行为时,您可以期待这种古怪。该死,在某些情况下,您可能会覆盖编译器决定插入两者之间的一些临时变量。
  • @Kirby:不一定每次都......但如果你故意超出缓冲区,你最好知道你的编译器是如何安排事情的。这意味着您应该至少检查一次相关地址。生成的代码可能在其他任何地方都不起作用,但它仍然可能对您有所帮助。 :)
  • 更好——堆栈的排列可以根据编译器选项和优化而改变。
  • @Kirby 您可能还想访问 gcc 特定页面 GNU libc - 3.2.1 Memory Allocation in C Programs 并注意 “在 GNU C 中,自动存储的大小可以是一个变化的表达式。在其他 C 实现中,它必须是一个常数。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2022-10-18
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多