gpt4 book ai didi

linux - 在 Linux 上访问 x86-64 架构上的堆栈帧

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:13 26 4
gpt4 key购买 nike

我正在尝试访问具有 x86-64 架构的 Linux 系统上的不同堆栈帧。我能够访问所有帧的寄存器基址指针 (rbp)。现在我想访问每个函数调用的参数。我检查了这个 link这表示前 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()。它们根本不存在,并且无法恢复,因为即使是像乘以 2 这样的简单操作也无法“撤消”(因为它可能已经溢出)。

关于linux - 在 Linux 上访问 x86-64 架构上的堆栈帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25822354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com