gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:13:21 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

当你声明你的变量时

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

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

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

关于c - 溢出的缓冲区数据不会连续存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com