我试图学习如何使用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 my 01 02
在这里,我知道&#34; argc&#34;应该是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
我没有找到关于&#34; 3&#34;的双关语的任何线索。保存在$ rbp + xBytes中的任何字节中。我的理解或命令是否有任何错误?
谢谢!
答案 0 :(得分:2)
我试图学习如何使用rbp / ebp来访问函数参数和局部变量
var agent = chai.request.agent(server);
return agent.post('/api/v1/account/login')
...
ABI 不使用堆栈传递参数;它们通过寄存器传递。因此,您无法在x86_64
之外的任何偏移处找到它们(这与$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
找不到任何有用的东西,因为它通常递增或递减8,以便存储整个64位值。