我試圖在x86-64體系結構的Linux系統上訪問不同的堆棧幀。我能夠訪問所有幀的寄存器基址指針(rbp)。現在我想訪問每個函數調用的參數。我檢查了link這說明前6個參數正在通過寄存器傳遞。但據我所知,通過讀取寄存器,我只能得到最頂層函數調用的參數。但是發送給其他函數的參數(即,位於當前幀之下的棧幀)呢?據推測,他們必須存儲在堆棧本身的某個位置,但我無法獲取位置。任何人都可以幫忙解釋一下嗎?在Linux上訪問x86-64體系結構上的堆棧幀
非常感謝。
我試圖在x86-64體系結構的Linux系統上訪問不同的堆棧幀。我能夠訪問所有幀的寄存器基址指針(rbp)。現在我想訪問每個函數調用的參數。我檢查了link這說明前6個參數正在通過寄存器傳遞。但據我所知,通過讀取寄存器,我只能得到最頂層函數調用的參數。但是發送給其他函數的參數(即,位於當前幀之下的棧幀)呢?據推測,他們必須存儲在堆棧本身的某個位置,但我無法獲取位置。任何人都可以幫忙解釋一下嗎?在Linux上訪問x86-64體系結構上的堆棧幀
非常感謝。
把這個代碼:
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這樣的簡單操作(因爲它可能已經溢出),也無法「撤消」。
它們不一定存儲在堆棧中,所以一般來說你無法訪問它們。還要注意,使用'rbp'作爲堆棧幀指針也是可選的。 – Jester 2014-09-13 11:18:10