【发布时间】:2015-11-25 20:07:10
【问题描述】:
我有下面的代码来模拟缓冲区溢出。
编辑:我错过了下面代码中的一个重要步骤。随着讨论的进行,变量 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地址:0xbfffddf i的地址:0xbfff fde0
如您所见,我的输入字符串包含大量 NOP (\x90),然后是大量 A (\x41)。在 GDB 堆栈帧中,您可以看到缓冲区的第一个 4 字节按预期连续填充,然后部分多余数据也连续填充。
来自(address: 0xbffffddc onwards till 0xbffffdfc)
但这不是完整的数据。然后中间还有一些其他数据,我的输入字符串可以从address 0xbffffe1c to 0xbffffe2c.再次看到
所以缓冲区虽然溢出,但溢出的数据并未存储在连续的位置。如何使溢出数据存储在连续的位置?
PS:在我的 Ubuntu 机器上,32 位系统,
【问题讨论】:
-
您使用的是什么平台?我隐约记得阅读过一些操作系统用来使此类攻击更加困难的各种对策,随机化内存位置等。我知道 OpenBSD 做了很多这样的事情。
-
我认为这个效果是因为金丝雀,用来呈现缓冲区溢出攻击。但我还没有想出一个正确的解释。
-
在没有堆栈保护的情况下编译代码,例如在海湾合作委员会
-fno-stack-protector。在 Visual Studio 中,通过添加/GS-关闭保护 -
@0x90 我已经用 gcc -g -fno-stack-protector -z execstack 编译了
-
请尝试使用此行:
gcc file.c -o output -fno-stack-protector。 gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Optimize-Options.html
标签: c arrays linux stack buffer-overflow