【发布时间】:2015-12-22 15:57:39
【问题描述】:
我正在尝试实施缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址。
使用 GDB 显示的地址与我刚刚在代码中显示的地址不同:
具体代码:
#include<stdio.h>
int main() {
char buffer[20];
printf("%p\n", buffer); // 0xbffff320
return 0;
}
但是,如果我这样做,在 gdb 中:
p &buffer
我得到:0xbffff330
为什么会有区别,它会破坏我的缓冲区溢出攻击吗?
我禁用了 ALSR 和堆栈保护。
谢谢。
编辑 1:即使我单步执行 gdb 并遇到打印行,我也会得到 0xbffff320 作为地址
编辑 2:
环境:Ubuntu Linux 9 映像在 Windows 7 上的虚拟机中运行。
gdb 版本:6.8-debian
使用 GCC 编译如:gcc -g -fno-stack-protector filename.c
立即执行:./a.out
打印地址:0xbffff320
然后像这样在调试器中打开:gdb ./a.out
然后输入b main
然后run
然后p &buffer
那么地址就是0xbffff330
编辑 3:
这是重现行为的 gdb 日志:
$ gdb ./a.out
b 主要
运行
p &buffer /* 这里的地址与我运行可执行文件时显示的不同 */
单步执行程序到 printf 语句 /* 这里的地址与 p &buffer 相同,但与程序运行时打印的不同 */
【问题讨论】:
-
你的意思是,在gdb的同一次运行中,printf和gdb的print输出不同的值?
-
依赖 未定义的行为 是一个非常糟糕的主意。无论如何,我不认为 SO 应该有助于利用漏洞。
-
@Olaf,这是一所大学的项目。我们正在学习如何堆叠粉碎。
-
@hdl,我们只允许编译禁用堆栈保护。所以我们唯一能提供的标志是-fno-stack-protector。 (除了可选的 -g 用于调试,-o 用于重命名可执行文件等)
-
好的。如果
p &buffer in gdb prints the same address as stepping past the printf statement in gdb,那么这与gdb 只是向环境中添加东西是一致的,正如@ouah 的回答所解释的那样。这里还有另一个不同之处:argv[0]。我添加了一个答案来解决这个问题。
标签: c pointers gcc gdb buffer-overflow