一种软件BUG导致ARM复位的方式

[复制链接]
2911|3
 楼主| dld2 发表于 2007-11-2 15:53 | 显示全部楼层 |阅读模式
程序出了BUG,导致ARM复位重启:<br />1、在函数内部定义一个数组,例如char&nbsp;buf[16];<br />2、向该数组中写一堆0,例如32个。也就是数组写越界。<br />3、该函数执行返回,导致ARM复位。<br /><br />究其原因:<br />buf是在栈中分配的。<br />ARM的栈向低地址生长,所以写数组越界,会导致写到栈中原来存储返回地址的位置。<br />然后,一个0地址就被加载到PC了。<br />
lenglx 发表于 2007-11-2 16:20 | 显示全部楼层

晕.

晕死.<br />亏你能想.<br /><br />即使如此,你的说法也不正确:<br />1.PC=0就是复位?<br />&nbsp;&nbsp;寄存器的值,中断逻辑,外设等等,因为你的PC=0,就复位了?<br /><br />2.函数返回就一定将堆栈中的内容弹出到PC?<br />&nbsp;&nbsp;a.&nbsp;如果函数足够简单,或者编译器优化时,认为不需要将LR入栈,就不会发生上面的情况.<br />&nbsp;&nbsp;b.&nbsp;使用C的话,RV编译器有个__inline关键字,C++,有inline关键字,让函数成为内嵌函数.都不会发生你所说的情况<br />
 楼主| dld2 发表于 2007-11-2 16:38 | 显示全部楼层

呵呵,只是描述一种现象

你说的都对。<br />但,俺的目的不是为了让它复位,而是调程序遇到这麽一个情况。<br />以前看到过网友说ARM复位了,认为是硬件问题。所以,把现象和分析描述出来供大家参考。<br />
wishcom 发表于 2007-11-2 19:31 | 显示全部楼层

LZ的思想是正确的

有个思路,如果我向数组里所写的数据是有组织有预谋的呢?<br />比如:<br />向数组里输入的是一小段代码<br />向数组越界后的返回值所在区域写的是数组的地址<br /><br />那么会发生什么事情呢?<br /><br />建议LZ看一本书《缓冲区溢出的原理和实践》是英文书《Smashing&nbsp;The&nbsp;Stack&nbsp;For&nbsp;Fun&nbsp;And&nbsp;Profit》的翻译,www.chinasafer.com网站上应该可以看见。<br /><br />小小透露一点:这是黑客必备的知识哦^^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

2442

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部