打印

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

[复制链接]
1947|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dld2|  楼主 | 2007-11-2 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序出了BUG,导致ARM复位重启:
1、在函数内部定义一个数组,例如char buf[16];
2、向该数组中写一堆0,例如32个。也就是数组写越界。
3、该函数执行返回,导致ARM复位。

究其原因:
buf是在栈中分配的。
ARM的栈向低地址生长,所以写数组越界,会导致写到栈中原来存储返回地址的位置。
然后,一个0地址就被加载到PC了。

相关帖子

沙发
lenglx| | 2007-11-2 16:20 | 只看该作者

晕.

晕死.
亏你能想.

即使如此,你的说法也不正确:
1.PC=0就是复位?
  寄存器的值,中断逻辑,外设等等,因为你的PC=0,就复位了?

2.函数返回就一定将堆栈中的内容弹出到PC?
  a. 如果函数足够简单,或者编译器优化时,认为不需要将LR入栈,就不会发生上面的情况.
  b. 使用C的话,RV编译器有个__inline关键字,C++,有inline关键字,让函数成为内嵌函数.都不会发生你所说的情况

使用特权

评论回复
板凳
dld2|  楼主 | 2007-11-2 16:38 | 只看该作者

呵呵,只是描述一种现象

你说的都对。
但,俺的目的不是为了让它复位,而是调程序遇到这麽一个情况。
以前看到过网友说ARM复位了,认为是硬件问题。所以,把现象和分析描述出来供大家参考。

使用特权

评论回复
地板
wishcom| | 2007-11-2 19:31 | 只看该作者

LZ的思想是正确的

有个思路,如果我向数组里所写的数据是有组织有预谋的呢?
比如:
向数组里输入的是一小段代码
向数组越界后的返回值所在区域写的是数组的地址

那么会发生什么事情呢?

建议LZ看一本书《缓冲区溢出的原理和实践》是英文书《Smashing The Stack For Fun And Profit》的翻译,www.chinasafer.com网站上应该可以看见。

小小透露一点:这是黑客必备的知识哦^^

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

2442

帖子

3

粉丝