gdb显示与代码不同的地址

Kin*_*ere 6 c gcc gdb pointers buffer-overflow

我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址.

使用GDB显示的地址与我在代码中执行此操作时的地址不同:

确切的代码:

#include<stdio.h>

int main() {
   char buffer[20];
   printf("%p\n", buffer); // 0xbffff320

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做在gdb中:

p &buffer
Run Code Online (Sandbox Code Playgroud)

我明白了: 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 然后runp &buffer

然后地址是0xbffff330

编辑3:

这是重现行为的gdb日志:

$ gdb ./a.out

b主要

这里的p&buffer/*地址与运行可执行文件时显示的不同*/

步骤通过程序到printf语句/*地址这里和p和缓冲区相同但不同于程序运行时打印的内容*/

Mar*_*ick 8

根据我的理解,问题main是当程序从shell启动时与从gdb启动时,本地变量的地址不同的原因.

这是一个显示差异的示例程序:

mp@ubuntu:~$ cat s.c
#include<stdio.h>

int main(int argc, char **argv) {
  char buffer[20];
  system("env");
  printf("%s %p\n", argv[0], buffer);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们将在干净的环境中运行它.(我也禁用了ASLR).

mp@ubuntu:~$ env -i sh
$ ./s
PWD=/home/mp
./s 0xbffffe48
Run Code Online (Sandbox Code Playgroud)

 

$ gdb ./s
(gdb) run
Starting program: /home/mp/s 
COLUMNS=80
PWD=/home/mp
LINES=42
/home/mp/s 0xbffffe08
Run Code Online (Sandbox Code Playgroud)

gdb print &buffer命令的输出与程序对地址的想法相同,但它们都与程序在shell中运行时不同.

(gdb) b 6
Breakpoint 1 at 0x804849c: file s.c, line 6.
(gdb) run
Starting program: /home/mp/s 
COLUMNS=80
PWD=/home/mp
LINES=42

Breakpoint 1, main (argc=1, argv=0xbffffed4) at s.c:6
6      printf("%s %p\n", argv[0], buffer);
(gdb) p &buffer
$1 = (char (*)[20]) 0xbffffe08
(gdb) n
/home/mp/s 0xbffffe08
8      return 0;
Run Code Online (Sandbox Code Playgroud)

有一些因素导致了这种差异:

  • gdb正在使用绝对路径名调用程序,因此argv数组更大.
  • gdb设置(或在这种情况下,添加)两个环境变量.这是完成的readline/shell.c:sh_set_lines_and_columns().因此环境阵列更大.

要从环境中删除这两个变量,可以使用unset environment,或设置exec-wrapper来运行env -u ....这样,gdb下的程序地址与在shell中运行时的地址相同(如果我们使用绝对路径名).

$ `pwd`/s
PWD=/home/mp
/home/mp/s 0xbffffe28

$ gdb `pwd`/s
(gdb) set exec-wrapper env -u LINES -u COLUMNS
(gdb) run
Starting program: /home/mp/s 
PWD=/home/mp
/home/mp/s 0xbffffe28
Run Code Online (Sandbox Code Playgroud)