6133|8

222

帖子

2

TA的资源

一粒金砂(高级)

楼主
 
购买主题 已有 7 人购买  本主题需向作者支付 2 分芯积分 才能浏览
点赞 关注
 

回复
举报

222

帖子

2

TA的资源

一粒金砂(高级)

来自 5楼
 
本帖最后由 lzwml 于 2016-1-31 20:31 编辑

上报漏洞
上面的代码存在严重栈溢出缺陷。原因在于:
当初为了调试,许多函数都定义 char strout[256],并且函数之间存在调用关系,Keil为STM32F10x系列启动代码里默认分配栈大小为0x400(1K),所以只要存在4个函数调用就完全能造成溢出。

解决方法:定义一个全局变量 char strout[256]供所有函数调用,或者仅在调试模式下定义该变量。

漏洞潜伏原因:
如果代码以-O3方式编译(好像默认建立工程就是这个优化方式),此模式代码运行崩溃时机不一定,因为-O3方式使得某些代码不用消耗栈,【但此时依旧消耗了不少的栈,处于代码崩溃边缘】,但若来了中断,并且中断里有许多函数调用,很容易莫名其妙崩溃。

浮现方法:
将代码以 -O0 方式不优化运行,代码必定崩溃(当然是在我自己的工程),我的工程里调用lc_CheckLicence(),满足if (islic && val > 0) 条件,开始执行里面的内容后程序立马崩溃。

讲解-O3和-O0对函数递归调用的优化方式:
在死循环递归调用里,-O0必定在栈溢出时崩溃,-O3未必,它将函数调用方式改成类似C语言的 goto xx;
ARM指令里
   B  以PC指针作为相对寻址,类似 goto,不需要用到栈,速度快,所以可能某些代码被-O3方式优化成   B  指令
   BL 将当前PC指针保存到 LR寄存器,压栈SP指针,运行函数代码,需要用到栈
  1. C代码
  2. void fun()
  3. {
  4.         fun();
  5. }


  6. -O0 的汇编
  7. void fun()
  8. {
  9.         fun()
  10.         BL fun // cal 到上面两行        
  11. }

  12. -O3的汇编
  13. void fun()
  14. {
  15.         fun()
  16.         B xxx // jump to 到上面两行        
  17. }
复制代码


此帖出自ARM技术论坛

点评

分析的很细致 赞一个  详情 回复 发表于 2016-2-1 09:41
 
 
 

回复

6419

帖子

17

TA的资源

版主

沙发
 
好贴!赞一个
此帖出自ARM技术论坛
 
个人签名training
 
 

回复

1027

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
不懂:)
此帖出自ARM技术论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 
这么吊,,,,
此帖出自ARM技术论坛
 
 
 

回复

2万

帖子

74

TA的资源

管理员

6
 
lzwml 发表于 2016-1-31 20:21
上报漏洞
上面的代码存在严重栈溢出缺陷。原因在于:
当初为了调试,许多函数都定义 char strout[256],并 ...

分析的很细致 赞一个
此帖出自ARM技术论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 
只要固件被暴力读出来一切都完了,听说价格2万元。
固件被读出来了做的加密就都没用了,而且最傻的就是比较验证码,这种比较验证码的有经验的人几分钟就能搞定。

我前些日子搞过一个破解唯一ID验证码的,很简单直接修改机器码加了个BL调用显示函数,直接把经过复杂计算后的验证码输出到液晶上

注意我是业余搞的,一堆汇编里面找关键的地方也不是那么容易的
有兴趣可以看看我那个破解STM32验证码的帖子
地址:


http://www.openedv.com/forum.php?mod=viewthread&tid=64664

此帖出自ARM技术论坛

点评

opendev里你的图挂了,反汇编也要看运气  详情 回复 发表于 2016-3-20 16:18
 
 
 

回复

222

帖子

2

TA的资源

一粒金砂(高级)

8
 
本帖最后由 lzwml 于 2016-3-20 16:27 编辑
yjmwxwx 发表于 2016-2-24 19:30
只要固件被暴力读出来一切都完了,听说价格2万元。
固件被读出来了做的加密就都没用了,而且最傻的就是比 ...

opendev里你的图挂了,更新一下反汇编也要看运气。
我也想到会被开盖反汇编,这也依靠stm32的读保护做反汇编后的防护。
反汇编后必须找到两个JUMP地点。
一个是计算校验值的合法JUMP,另一个是芯片读保护锁死的JUMP。

如果没正确修改第一个JUMP,那么将逆向的BIN下载到芯片里,芯片会被第二个JUMP语句中的读保护锁死,迫使对方逆向过程芯片报废的代价

除非有办法将被锁死的芯片,依旧能开盖解除(开盖后芯片是不是废了不清楚)



此帖出自ARM技术论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
非常好的帖子
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表