我有以下代码来模拟缓冲区溢出。
编辑:我错过了以下代码中的重要步骤。随着讨论的进展,变量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位系统,
答案 0 :(得分:2)
宣布变量时
int i = 0;
int n;
char c;
char s[4];
假设堆栈溢出“up”超过c
,您依赖的假设可能不正确,即变量在堆栈上紧邻。这可能不是真的,因为变量之间可能存在“堆栈保护”或“堆栈金丝雀”。
要了解更多相关信息,请查找“堆栈保护”和“堆栈金丝雀”: