在Linux上访问x86-64体系结构上的堆栈帧



我正在尝试访问x86-64体系结构的Linux系统上的不同堆栈帧。我可以访问所有帧的寄存器基指针(rbp)。现在我想访问每个函数调用的参数。我检查了这个链接,它说前6个参数正在通过寄存器传递。然而,据我所知,我只能通过读取寄存器来获得最顶层函数调用的参数。但是,发送给其他函数的参数(即位于当前帧下方的堆栈帧)呢?据推测,它们一定存储在堆栈本身的某个位置,但我无法获得位置。有人能帮忙解释一下吗?

非常感谢。

取此代码:

int f1(int a1, int a2, int a3) {
  return f2(2 * a1, 2 * a2, 2 * a3);
}
int f2(int a1, int a2, int a3) {
  return a1 + a2 + a3;
}

现在假设我们调用f1():我们按照调用约定将其参数放入RDI、RSI和RDX中。然后,它将这些寄存器中的每个寄存器乘以2,并调用f2()。这些寄存器被定义为调用方保存,但不需要保存它们,因为f1()将不会再次使用它们。因此,一旦我们进入f2(),我们就不能合理地期望有任何方法将原始参数传递给f1()。它们根本不存在,无法恢复,因为即使是像multiply-by-2这样的简单操作也无法"撤消"(因为它可能已经溢出)。

最新更新