首页
社区
课程
招聘
[原创] STM32 逆向 -- 固件Dump 教程
2017-11-17 18:15 27063

[原创] STM32 逆向 -- 固件Dump 教程

2017-11-17 18:15
27063

背景

终于难得闲暇和久违的激情 , 赶紧动手 , 这次也是初步的体验 , 所以目的就是简单的 dump 程序 , 和基本反汇编

工具集介绍

软件部分

  • OpenOCD
    Open On-Chip Debugger 著名的开源硬件调试器
    支持多种的 调试器 (St-link)(jlink) 之类的符合JTAG标准的
    支持多种 MPU 调试 只要是主流的都有(这次用到的 STM32F1x 默认有了配置文件)

    http://openocd.zylin.com/
    这里附上配置文件下载地址可以选择不同的 mpu

  • Arm-none-edbi-*
    ARM 裸机使用的工具链 (注意是 none 不是 linux)
    这里主要提供调试 的 RunTime

  • gdb
    GDB, the GNU Project debugger 著名开源调试器
    这里用于代替 OCD 的调试 , 毕竟还是专业许多
    我们需要的功能虽然 OCD 就可以实现 , 但是使用GDB 还是方便很多

硬件部分

由于也是初步尝试 , 所以直接找了正点原子的 战舰开发板
(我们要使用的就是 JTAG 调试口, 当然开发板已经接好了)

  • 战舰F1开发板 * 1

    采用的 STM32F1X 系列的 MPU 这个型号很重要 , 这个就决定了我们要dump的地址
    这样才能 找到flash 和sram 等

  • Jlink * 1
    (当然国产寨版) 


  • 能用就行
    这个就是淘宝货 , 简单暴力 , 久经沙场 , 人手一个 , 纵横江湖

动手

运行OCD

openocd -f interface/jlink.cfg -f target/stm32f1x.cfg
#注意不要反了

这里的两个 f 是指定的配置文件, 大众器件 所以自带的都有, 要是没有的话就在上面给出的网址下载即可
(这个不是全路径 是相对与 ocd 的安装目录 )

运行之后 , 效果如图

这样显示之后 , 说明调试器链接正常 , 且已经进入调试模式

OCD命令

OCD在 成功 介入JTAG之后 会返回一个 4444 的 tty控制台 我们直接 telnet上去

telnet localhost 4444 
#或者万能 NC 也可以
#nc -t localhost 4444



这里就会返回一个 OCD 的调试会话
现在已经控制CPU了(help 一大堆 不再赘述)
由于我们是要对固件进行dump, 所以只要已经运行, 我们把内存, 和flash 的数据抓出来就好了

halt
#执行halt语句 (CPU 暂停)

GDB Attach

实际上直接使用OCD 可以达到效果, 不过使用GDB 辅助, 使得操作容易方便(可以TAB)

gdb #先运行GDB
(gdb) target remote localhost:3333



执行完后 DGB attach 完成
(现在已经拿到了 CPU 的shell 可以为所欲为了)

DUMP(重要)

终于到了最为核心的一步,就是firmware的dump操作
首先我们需要的最重要的 的东西就是内存映射图
这个就相当于我们的 地图一样 告诉我们哪里有 什么数据 , 哪里是什么东西
(这里就需要查看芯片手册)
在手册的第四节 Memory Mapping中


(图挺大 截取需要部分)
我们需要Dump的有

  • Flash (装代码的你说呢)
  • SRAM (运行时候产生有趣的东西)

这样我们查看映射图可以得到信息

  • flash的映射地址是 0x08000000 ~ 0x0807ffff (512KB)
  • sram的映射地址是 0x20000000 ~ 0x2000ffff (64K)

所以下面我们在gdb 中 把他们dump出来就好

dump  binary memory 32_sram.bin  0x20000000 0x2000ffff
dump  binary memory 32_flash.bin  0x08000000 0x0807ffff

上述命令就是以二进制形式 Dump 内存 和 flash 的数据出来


查看文件 大小就是我们的存储空间
到这里 本次 DUMP 完毕

后记

这里 只是逆向的初步,分析才是关键
得到 flash 和 sram 数据后 使用 IDA 进行 操作 (这才是逆向)



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2018-11-8 18:18 被kanxue编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (25)
雪    币: 7074
活跃值: (3468)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 6 2017-11-17 21:05
2
0
可以,赞一个~~~
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PYGame 2017-11-18 00:03
3
0
固件Dump出来的是hex还是bin?
雪    币: 235
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
林海n 2017-11-18 05:12
4
0
bxc 可以,赞一个~~~
谢谢围观~
雪    币: 235
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
林海n 2017-11-18 05:13
5
0
PYGame 固件Dump出来的是hex还是bin?
选择  binary  的dump  出来的是bin文件
其实  HEX  和  bin没啥差别
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PYGame 2017-11-18 11:01
6
0
大牛,  所有的芯片都能用类似的方法,  dump  吗? 
雪    币: 235
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
林海n 2017-11-18 11:20
7
0



PYGame

大牛, 所有的芯片都能用类似的方法, dump 吗?
我只是小白....
这个的使用 针对于 有jtag 接口的
雪    币: 51
活跃值: (598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
金奔腾 2017-11-21 08:34
9
0
关注一下,感谢分享
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 2017-11-21 09:48
10
0
不错!
雪    币: 519
活跃值: (3752)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
龙飞雪 2017-11-21 10:24
11
0
不错~~
雪    币: 1243
活跃值: (1815)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
库尔 2017-11-21 14:04
12
0
邪恶公司?学主角设备打补丁?
雪    币: 2443
活跃值: (434)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 1 2017-11-22 14:03
13
0
666学习学习~
雪    币: 51
活跃值: (598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
金奔腾 2017-11-22 17:40
14
0
问个问题,固件上锁或者禁用调试模式了,这个方法也能行吗?
雪    币: 8091
活跃值: (4376)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2017-11-23 13:11
15
0
设置了读保护,怎么dump?
雪    币: 39
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenjabc 2017-11-26 13:39
16
0
特别干兴趣,只是自己没这功力,希望大大多出几篇,在此谢过!!!!
雪    币: 2371
活跃值: (229)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
少尉 2017-11-26 19:41
17
0
这都不是事,实际问题是怎么找到JTAG引脚才重要的,参见:JTAG  Pin  Finder,使用andruio来测试芯片引脚查找jtag端口。看国外测试是成功的,但自己实际测试有难度,芯片引脚太近,接线太难。
雪    币: 204
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wmslecz 2017-11-28 22:17
18
0
PYGame 固件Dump出来的是hex还是bin?
bin吧。上面截图都说了。
雪    币: 413
活跃值: (341)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dongshan 2017-12-10 22:01
19
0
芯片security之后,你就读不出了。
雪    币: 803
活跃值: (850)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
yjmwxwx 2017-12-22 10:07
20
0
这个根本没用,芯片有读保护,FLASH上锁后根本读不出来,你连上调试器芯片就会把FLASH全部擦除。
其实也就是读个内存,JLINK官方驱动里面那个命令行里面输入:  savebin  /home/yjmwxwx/1.bin  0x20000000  0x5000
就读出内存了 
雪    币: 1348
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lyy李 2018-1-6 07:45
21
0
无视保护吗?不是特别懂。
雪    币: 32410
活跃值: (18730)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2018-11-8 18:13
22
0
图片丢失了,从CSDN博客转了一份图过来。
最后于 2018-11-8 18:20 被kanxue编辑 ,原因:
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_kx78191 2018-11-10 19:56
23
0
不设置保护的代码没有价值,有价值的都有保护
雪    币: 199
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baidxdjkl 2018-11-12 01:33
24
0
没什么用,第一,jtag在实际项目中,基本都没有接,还有就是jtag在代码中是可以禁用的。
雪    币: 13
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iyyy 2019-7-18 20:07
25
0
mark 
游客
登录 | 注册 方可回帖
返回