学习时间:2013/9/16
Linux下有三类获取函数调用栈信息的函数:
(1)__builtin_frame_address();(2)__builtin_return_address();(3)backtrace()类。
但是经过测试发现在MIPS架构的处理器上都不能正常使用。通过分析X86与MIPS函数调用的反汇编代码,可以得到X86架构与MIPS架构在函数调用的时候开辟的栈空间如下;
MIPS架构函数调用时栈情况
然而X86架构下预防缓冲区溢出的核心算法就是:
第一句得到当前函数栈的栈帧指针,也即EBP寄存器值;第二句通过得到当前栈帧指针所指向的值得到调用当前函数的栈帧指针(巧妙运用X86架构上函数调用时候栈帧指针递归入栈的原理)。
然而,在MIPS下的函数调用的栈只有一个SP寄存器保存栈顶指针。无法仿照X86架构实现。
解决办法:(1)修改MIPS编译器漏洞;
当然:这只是我个人的思考与理解,也许MIPS爱好者有更好的解决办法,愿意学习!