我正在尝试使用x86-64架构访问Linux系统上的不同堆栈帧。我可以访问所有帧的寄存器基址指针(rbp)。现在我想访问每个函数调用的参数。我检查了这个link,它说前6个参数是通过寄存器传递的。但是,据我所知,我只能通过读取寄存器来获得最顶层函数调用的参数。但是发送给其他函数的参数(即位于当前帧下面的堆栈帧)呢?据推测,它们必须存放在堆栈本身的某个位置,但我无法获得该位置。任何人都可以帮忙解释一下吗?
非常感谢。
答案 0 :(得分:1)
拿这段代码:
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()。它们根本就不存在,并且无法恢复,因为即使是像2乘法一样的简单操作也无法“撤消”(因为它可能已经溢出)。