Assembly GDB:什么指令称为帧?

Assembly GDB:什么指令称为帧?,assembly,gdb,callstack,Assembly,Gdb,Callstack,我对GDB和汇编有点陌生。我正在尝试反向设计一个单人游戏,我正在玩一个纯粹为了学习体验的培训师。我第一次在Linux中使用scanmem,但是它的值在内存中从来都不在同一个位置,所以我每次玩的时候都必须找到它,这是最不耗时的,尤其是当我试图跟踪许多变量时 因此,我目前正在尝试找出如何在运行时准确确定特定变量的位置。我尝试禁用ASLR,但没有成功。这让我找到了GDB。我使用memscan找到了我目前关注的变量,并成功地在GDB中设置了一个观察点。现在,值改变,程序停止,我可以在GDB中使用它。由于

我对GDB和汇编有点陌生。我正在尝试反向设计一个单人游戏,我正在玩一个纯粹为了学习体验的培训师。我第一次在Linux中使用scanmem,但是它的值在内存中从来都不在同一个位置,所以我每次玩的时候都必须找到它,这是最不耗时的,尤其是当我试图跟踪许多变量时

因此,我目前正在尝试找出如何在运行时准确确定特定变量的位置。我尝试禁用ASLR,但没有成功。这让我找到了GDB。我使用memscan找到了我目前关注的变量,并成功地在GDB中设置了一个观察点。现在,值改变,程序停止,我可以在GDB中使用它。由于这不是一个开源程序,我坚持分析汇编指令而不是源文件

我在这里检查了帧堆栈,我看到了称为帧0x000000000050d0fc的帧0x000000000050d338。但是,我如何知道调用帧中的哪条指令触发了被调用到新帧的操作?我正试图反向工作,这样我就可以通过分析函数参数,在0x1a76f5e8或指向它的某个指针引用处跟踪变量的原点,直到内存中的某个静态位置。我还尝试使用MEMSCAN来简单地将地址写入到内存中——这将是指向该变量/对象的指针,但它不可能是一个类的成员,它位于我想象的内存结构的中间。
如何确定对当前帧的调用是在调用帧中的何处进行的?

堆栈上的返回地址应该刚好指向使您到达该帧的调用指令。如果您有标准堆栈帧,gdb甚至会显示您是否使用backtrace命令。由于此程序没有调试符号,backtrace命令显示的信息非常有限:仅显示没有参数的帧地址,可能是因为它们是通过x86_64系统上的寄存器传递的?此时,在程序中,%rsp指向0x7fffffffaae4。0x7FFFFFAAE4+4的内容是0x00 0x00。这不应该是返回地址吗?在函数项中,返回地址位于%rsp,您可以使用x/a$rsp打印它。还要注意的是,在64位模式中,指针显然是64位的.Hm,据我所知,函数入口的$rsp+4。因为我在函数的中间停止了,所以我不知道%RSP是否会帮助我,因为这一点最有可能被添加到堆栈中。我想我是通过使用%rbp+8找到答案的,现在我只需要找出查看代码的方法,因为由于某些原因,我无法在汇编视图中向上滚动。我只能向下滚动。如果您设置了非强制的旧堆栈帧,则可以使用rbp+8。不管你在哪里读过,rsp+4都是胡说八道。