从预防缓冲区溢出看MIPS与X86在函数调用开辟栈的区别

来源:互联网 发布:深圳市信诚网络 编辑:程序博客网 时间:2024/05/17 20:33

                                                                                                                               学习时间:2013/9/16

Linux下有三类获取函数调用栈信息的函数:

(1)__builtin_frame_address();(2)__builtin_return_address();(3)backtrace()类。

但是经过测试发现在MIPS架构的处理器上都不能正常使用。通过分析X86与MIPS函数调用的反汇编代码,可以得到X86架构与MIPS架构在函数调用的时候开辟的栈空间如下;

从预防缓冲区溢出看MIPS与X86在函数调用开辟栈的区别

X86架构函数调用时栈情况

从预防缓冲区溢出看MIPS与X86在函数调用开辟栈的区别

MIPS架构函数调用时栈情况

然而X86架构下预防缓冲区溢出的核心算法就是:

fp = __builtin_frame_address(0); (1)

nextfp = *(void **)fp; (2)

第一句得到当前函数栈的栈帧指针,也即EBP寄存器值;第二句通过得到当前栈帧指针所指向的值得到调用当前函数的栈帧指针(巧妙运用X86架构上函数调用时候栈帧指针递归入栈的原理)。

然而,在MIPS下的函数调用的栈只有一个SP寄存器保存栈顶指针。无法仿照X86架构实现。

解决办法:(1)修改MIPS编译器漏洞;

(2)修改动态库,用内联函数或者宏定义试下;

(3)寻找一个巧妙的算法抓住MIPS栈空间SP指针与栈底指针规律;

当然:这只是我个人的思考与理解,也许MIPS爱好者有更好的解决办法,愿意学习!

0 0