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

时间:2015-11-14 12:50:13

标签: c arrays linux stack buffer-overflow

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

编辑:我错过了以下代码中的重要步骤。随着讨论的进展,变量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位系统,

1 个答案:

答案 0 :(得分:2)

宣布变量时

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

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

要了解更多相关信息,请查找“堆栈保护”和“堆栈金丝雀”: