我正在尝试实现缓冲区溢出攻击,我需要知道我要溢出的缓冲区的地址。
使用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:
环境:在Windows 7上运行的虚拟盒中的Ubuntu Linux 9映像。
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 main
run p & buffer /*此处的地址与运行可执行文件时显示的不同*/
逐步执行程序到printf语句 /*此处的地址与运行程序时打印的不同*/
p &buffer
打印的地址与在gdb中跳过printf语句后的地址相同,则这与gdb仅仅向环境添加内容是一致的,正如@ouah的答案所解释的那样。这里还有另一个不同之处:argv[0]。我已经添加了一个答案来解决这个问题。 - Mark Plotnick