溢出的缓冲区数据不会连续存储

Overflowed buffer data does not get stored contiguously

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

编辑:我错过了下面代码中的一个重要步骤。随着讨论的进行,变量 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地址:0xbfff fddf i的地址:0xbfff fde0

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

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

中看到

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

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

当您声明变量时

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

假设堆栈溢出 "up" 超过 c,您依赖的假设可能不正确,即变量在堆栈上紧邻。这可能不是真的,因为变量之间可能有 "stack guard" 或 "stack canary"。

要了解更多相关信息,请查找 "stack guard" 和 "stack canaries":