STM32 逆向初步

STM32 逆向初步

背景

终于难得闲暇和久违的激情 , 赶紧动手 , 这次也是初步的体验 , 所以目的就是简单的 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

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

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

运行之后 , 效果如图
神奇耶
这样显示之后 , 说明调试器链接正常 , 且已经进入调试模式

OCD命令

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

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

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

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

GDB Attach

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

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

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

DUMP(重要)

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

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

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

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

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

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

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

Dump

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

后记

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

这里写图片描述

一杯可乐~