0

我正在尝试学习如何使用 rbp/ebp 访问 ubuntu1604、64bit 上的函数参数和局部变量。我有一个简单的 c 文件:

#include<stdio.h>
int main(int argc,char*argv[])
{
  printf("hello\n");
  return argc;
}

我编译它:

gcc -g my.c

然后使用参数参数对其进行调试:

gdb --args 我的 01 02

在这里我知道“argc”应该是 3,所以我尝试检查:

(gdb) b main
Breakpoint 1 at 0x400535: file ret.c, line 5.
(gdb) r
Starting program: /home/a/cpp/my 01 02

Breakpoint 1, main (argc=3, argv=0x7fffffffde98) at ret.c:5
5     printf("hello\n");
(gdb) x $rbp+4
0x7fffffffddb4: 0x00000000
(gdb) x $rbp+8
0x7fffffffddb8: 0xf7a2e830
(gdb) x/1xw $rbp+8
0x7fffffffddb8: 0xf7a2e830
(gdb) x/1xw $rbp+4
0x7fffffffddb4: 0x00000000
(gdb) x/1xw $rbp
0x7fffffffddb0: 0x00400550

我没有发现任何线索表明“3”的双字保存在 $rbp+xBytes 的任何字节中。我的理解或命令有什么问题吗?

谢谢!

4

1 回答 1

2

我正在尝试学习如何使用 rbp/ebp 访问函数参数和局部变量

x86_64 ABI不使用栈传递参数;它们在寄存器中传递。因此,您不会在任何偏移处找到它们$rbp(这与ix86调用约定不同)。

要查找参数,您需要查看$rdi$rsi注册器:

Breakpoint 1, main (argc=3, argv=0x7fffffffe3a8) at my.c:4
4     printf("hello\n");

(gdb) p/x $rdi
$1 = 0x3                   # matches argc
(gdb) p/x $rsi
$2 = 0x7fffffffe3a8        # matches argv

x $rbp+4

几乎肯定不会在 处找到任何有用的东西$rbp+4,因为它通常以 8 递增或递减,以便存储整个 64 位值。

于 2016-09-27T03:23:50.903 回答