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


                                                                                                                                学习时间: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爱好者有更好的解决办法,愿意学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值