【问题标题】:Overflowed buffer data does not get stored contiguously溢出的缓冲区数据不会连续存储
【发布时间】:2015-11-25 20:07:10
【问题描述】:

我有下面的代码来模拟缓冲区溢出。

编辑:我错过了下面代码中的一个重要步骤。随着讨论的进行,变量 c 正在被修改。

void function (int fd, int e)
{
        int i = 0;
        int n;
        char c;
        char s[44];
        .
        .
        c = getchar(fd);
        .
        //Some check on c
        s[i++] = c;
        .
        //Some more local variables and some operations on them.
}

我试图通过发送更多 > 4 字节的输入来溢出缓冲区,以查看局部变量和 EBP 和 RET 以及参数是如何被修改的。

但是,当我在 GDB 中调试以查看堆栈帧时,此缓冲区会溢出,并且溢出的数据似乎没有分配到连续的内存位置。

缓冲区基地址:0xbfff fdb3 C地址:0xbfffddf i的地址:0xbfff fde0

如您所见,我的输入字符串包含大量 NOP (\x90),然后是大量 A (\x41)。在 GDB 堆栈帧中,您可以看到缓冲区的第一个 4 字节按预期连续填充,然后部分多余数据也连续填充。 来自(address: 0xbffffddc onwards till 0xbffffdfc)

但这不是完整的数据。然后中间还有一些其他数据,我的输入字符串可以从address 0xbffffe1c to 0xbffffe2c.再次看到

所以缓冲区虽然溢出,但溢出的数据并未存储在连续的位置。如何使溢出数据存储在连续的位置?

PS:在我的 Ubuntu 机器上,32 位系统,

【问题讨论】:

  • 您使用的是什么平台?我隐约记得阅读过一些操作系统用来使此类攻击更加困难的各种对策,随机化内存位置等。我知道 OpenBSD 做了很多这样的事情。
  • 我认为这个效果是因为金丝雀,用来呈现缓冲区溢出攻击。但我还没有想出一个正确的解释。
  • 在没有堆栈保护的情况下编译代码,例如在海湾合作委员会-fno-stack-protector。在 Visual Studio 中,通过添加 /GS- 关闭保护
  • @0x90 我已经用 gcc -g -fno-stack-protector -z execstack 编译了
  • 请尝试使用此行:gcc file.c -o output -fno-stack-protectorgcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Optimize-Options.html

标签: c arrays linux stack buffer-overflow


【解决方案1】:

当你声明你的变量时

    int i = 0;
    int n;
    char c;
    char s[4];

假设堆栈“向上”溢出c,您所依赖的假设可能不正确,即变量在堆栈上紧邻。这可能不是真的,因为变量之间可能存在“堆栈保护”或“堆栈金丝雀”。

要了解更多信息,请查找“stack guard”和“stack canaries”:

【讨论】:

  • 我知道这一点。但是根据第一个链接,以及我所知道的 ...Stack Guard 在调用函数之前在局部变量和堆栈上的返回地址之间写入一个 Canary 字,并在函数返回之前对其进行检查。 ...这意味着在返回地址和变量之间有一个金丝雀,当缓冲区溢出完成时,金丝雀将被覆盖(这就是检测缓冲区溢出攻击的方式)。但是这里的金丝雀并没有被覆盖。
  • 您可以通过在每个位置写入不同的字节(即计数器)来获得更多洞察力,以便您可以将其与位置地址进行比较。
  • 我认为这不能回答 OP 的问题。
  • OP 似乎并不了解堆栈金丝雀。也许有人可以做一个更好的分析。
  • 是的,但答案应该证明缓冲区被覆盖的原因。可能是因为金丝雀,但我无法理解你的解释。
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2013-07-19
  • 2013-11-06
  • 2013-04-11
相关资源
最近更新 更多