背景
终于难得闲暇和久违的激情 , 赶紧动手 , 这次也是初步的体验 , 所以目的就是简单的 dump 程序 , 和基本反汇编
工具集介绍
软件部分
OpenOCD
Open On-Chip Debugger 著名的开源硬件调试器
支持多种的 调试器 (St-link)(jlink) 之类的符合JTAG标准的
支持多种 MPU 调试 只要是主流的都有(这次用到的 STM32F1x 默认有了配置文件)http://openocd.zylin.com/
这里附上配置文件下载地址可以选择不同的 mpuArm-none-edbi-*
ARM 裸机使用的工具链 (注意是 none 不是 linux)
这里主要提供调试 的 RunTimegdb
GDB, the GNU Project debugger 著名开源调试器
这里用于代替 OCD 的调试 , 毕竟还是专业许多
我们需要的功能虽然 OCD 就可以实现 , 但是使用GDB 还是方便很多
硬件部分
由于也是初步尝试 , 所以直接找了正点原子的 战舰开发板
(我们要使用的就是 JTAG 调试口, 当然开发板已经接好了)
战舰F1开发板 * 1
采用的 STM32F1X 系列的 MPU 这个型号很重要 , 这个就决定了我们要dump的地址
这样才能 找到flash 和sram 等Jlink * 1
(当然国产寨版)
这个就是淘宝货 , 简单暴力 , 久经沙场 , 人手一个 , 纵横江湖
动手
该接的先都接上 (电源 jlink blah..)
运行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 进行 操作 (这才是逆向)