Linux下有三類獲取函數調用棧信息的函數:
(1)__builtin_frame_address();(2)__builtin_return_address();(3)backtrace()類。
但是經過測試發現在MIPS架構的處理器上都不能正常使用。通過分析X86與MIPS函數調用的反彙編代碼,可以得到X86架構與MIPS架構在函數調用的時候開闢的棧空間如下;
MIPS架構函數調用時棧情況
然而X86架構下預防緩衝區溢出的核心算法就是:
fp = __builtin_frame_address(0); (1)
nextfp = *(void **)fp; (2)
第一句得到當前函數棧的棧幀指針,也即EBP寄存器值;第二句通過得到當前棧幀指針所指向的值得到調用當前函數的棧幀指針(巧妙運用X86架構上函數調用時候棧幀指針遞歸入棧的原理)。
然而,在MIPS下的函數調用的棧只有一個SP寄存器保存棧頂指針。無法仿照X86架構實現。
解決辦法:(1)修改MIPS編譯器漏洞;
(2)修改動態庫,用內聯函數或者宏定義試下;
(3)尋找一個巧妙的算法抓住MIPS棧空間SP指針與棧底指針規律;
當然:這只是我個人的思考與理解,也許MIPS愛好者有更好的解決辦法,願意學習!