溢出的缓冲区数据不会连续存储
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":
我有下面的代码来模拟缓冲区溢出。
编辑:我错过了下面代码中的一个重要步骤。随着讨论的进行,变量 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":