首页
社区
课程
招聘
[原创]使用IDA pro逆向ARM M系核心的Bin固件
2019-3-6 16:22 64495

[原创]使用IDA pro逆向ARM M系核心的Bin固件

2019-3-6 16:22
64495

使用IDA pro逆向ARM M系核心的Bin固件

作者:backahasten @看雪智能硬件安全小组,重庆邮电0xFA

​ 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候,却有很多问题。要不然是根本拿不到固件,要不然是拿到了Bin之后看不懂,这篇文章带大家手把手调教IDA pro,让他逆向无符号的Bin文件。

一.意义

​ 先说一下逆向固件的意义把,一般来说,这种小东西都会和外界有交互,蓝牙,WIFI,网络,4G,zigbee等等,我们逆向出他的协议就可以发现其中的安全问题。比如如果你逆向了一个手环的协议,发现它没有做身份验证或者验证不严谨,就可以批量的影响手环,或者你搞定了一个网络协议,可能发现一个网络的暴露服务,对云平台发起攻击,等等。

 

​ 我们当然可以从APP上入手去搞,但是这几年,随着APP加固的大面积使用,难度系数正在上升,而硬件上,特别是M系的MCU,为了成本,运算速度和功耗,很少有使用加密一类防御手段的。STM32系列可以使用设置RDP位的方式锁死固件读取,但是这样搞了之后,程序也就没有办法升级了,同时也带来了开发和调试时间上的消耗,面对整分夺秒的市场,使用的还是很少的。(实际上即便是开了防御也是有方法搞的。。。)

二.通过文件结构使IDA正确反汇编

​ 在开始搞之前,我们先了解一下文件的结构。

 

​ 大家熟悉的windows或者linux下的可执行文件,里面会包含一些函数信息,也会包含加载基址,段,架构等信息,但是嵌入式设备为了减小flash的占用,这一切统统没有。所以拖进IDA中之后是这个样子的。

 

IDA会问你,他是什么架构的。

 

​ 我们可以通过查询芯片信息的方式或得到架构的信息(ARM架构当然是ARM啊),选择使用ARM小端序进行反汇编。

 

 

​ 确定进入之后,IDA还会问你一些信息。

 

 

​ IDA会问你,RAM的位置,ROM的位置和加载基址。由于我们什么都不知道,直接按OK进入,等我们拿到了一些信息之后回来改。

 

 

​ 进去之后是这个样子的,先别慌,我们还要改一个东西。

 

​ M系使用的是ARM的Thumb指令集,所以需要先改为Thumb指令集汇编。按ALT+g,把里面T的值改为0x1.

 

 

之后就成了这个样子

 

 

我们先在0x00000000的位置按d,改变IDA的显示位数,到DCB。在0x00000004的位置也一样。

 

 

这个时候就要对整个ARM M核心的启动流程有熟悉了,首先,0x00000000位置的值作为栈的SP指针,之后把0x00000004位置的值写入PC指针,也就是芯片上电之后开始的位置。

 

这个时候,就看出加载基质的作用了,由于加载基地址不明确,我们跳不到0x10001065中去。

 

我们可以在每个0x2对齐的位置去按C(因为Thumb指令是0x2对齐的),让IDA Pro强行反汇编。

 

按了几个之后,就会发现整个调用的架构逐渐清晰起来了。

 

这时候,会发现一些位置的地址是红色的,表示超出索引

 

 

可以看出这两句使用BX的绝对跳转,加载基地址不会小于0x10000000,实际上就是0x10000000.具体加载基址的确定,还是需要研究人员对硬件和架构的熟悉,有很大程度是猜和试的成分。

 

比如上面的两句话,实际上就是0x00000004地址上的值跳转过来的,0x10001065和0x10001064相差0x1,这是一个历史遗留问题,但是不会产生影响,CPU会自动纠偏。凭借此就可以得出加载基址的位置。

 

去年KCON,有一个议题就是讲如何自动寻找加载地址,利用的就是固件中一些绝对的加载位置,有兴趣大家可以看一下。

 

确定了加载地址,我们重新载入之后,就可以看见正常的调用关系了。

 

 

之后在还是按照上面的方法,进行操作,由于加载地址是正确的,就可以识别出很多的函数调用关系,我们按C强制让ida pro汇编的地方也会少很多。

 

里面还会发现一些红色的地址,这就要参考硬件的芯片手册确定意义了

 

有一些函数是硬件中断处理函数,由硬件触发,与主线没有调用关系,所以还是会发现一些没有反汇编的代码,手动按C汇编一下就行了。

 

但是其中的函数没有名字,是这个样子的,很难受

 

 

怎么办呢?由于硬件的底层函数大部分都是标准函数,由芯片厂商提供,因此可以自己搭建一个和目标相同的开发环境,编译一个函数比较全的固件,之后使用bindiff进行函数查找。

 

我们先写一个函数比较多的程序,之后编译,得到axf文件,使用ida进行反编译

 

axf文件是有很多辅助信息的,拖入之后ida pro直接可以识别

 

反汇编之后,代码结构和函数名可以直接显示出来

 

 

这个时候直接关闭,保存反汇编的结果

 

打开目标bin文件,恢复出函数结构之后,打开bindiff,加载之前保存的axf文件的反汇编结果

 

 

加载之后

 

 

可以看到函数名的对应关系

 

 

我们也可以简单看一下bindiff的匹配原理是什么,每个匹配的函数,bindiff都会给一个匹配理由

 

 

这样我们就可以使用IDA PRO继续进一步的分析了,希望这篇文章抛砖引玉,可以让大家的研究出更多好玩的东西。
----------------分割线---------------------------------------
今天下载的NSA刚发布的ghidra 9.0,逆向ARM M也是同一个套路,只不过操作的键位不同。效果如下:

还算可以
但是他的diff功能更倾向于查找不同点,我暂时还没找到构建函数名索引,目前还是IDA Pro比较好用


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

最后于 2019-3-6 17:10 被backahasten编辑 ,原因: 增加ghidra_9.0内容
收藏
点赞23
打赏
分享
打赏 + 14.00雪花
打赏次数 4 雪花 + 14.00
 
赞赏  yjmwxwx   +5.00 2019/03/10
赞赏  Editor   +2.00 2019/03/07 感谢分享~
赞赏  orz1ruo   +2.00 2019/03/07 助人为乐~
赞赏  junkboy   +5.00 2019/03/06 感谢分享~
最新回复 (44)
雪    币: 26435
活跃值: (18462)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2019-3-6 16:31
2
0
感谢分享!
雪    币: 734
活跃值: (458)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
backahasten 1 2019-3-6 16:34
3
0
kanxue 感谢分享![em_63]
雪    币: 2043
活跃值: (2092)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
gtict 2019-3-6 17:01
4
0
backahasten [em_13]
以前也分析过这样的bin文件,但遇到没符号的一脸蒙蔽。现在还是没有看明白符号表是怎么做的。还有就是基地址是通过dump硬件内存也可以。
雪    币: 6767
活跃值: (4417)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2019-3-6 17:04
5
0
虽然有点流水账,但分享的经验不错,可以给新手一个很好引导,精华鼓励一下。backahasten同学再接再厉!
雪    币: 734
活跃值: (458)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
backahasten 1 2019-3-6 17:07
6
0
gtict 以前也分析过这样的bin文件,但遇到没符号的一脸蒙蔽。现在还是没有看明白符号表是怎么做的。还有就是基地址是通过dump硬件内存也可以。
一般来说,同款芯片的编译环境是相同的,都用的keil或者iar,也使用的都是标准库,所以我们是可以构建一套同样的编译环境,自己编译一套库函数比较全的文件,但是保留符号。
之后用bindiff这个插件对比我们自己编译的和目标bin,ida就会在bin文件里重构函数名字
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
大只狼 2019-3-6 17:18
7
0
不懂电路也可以搞这个吗。学过一些,但是都忘了。感觉这比windows好找工作些啊
雪    币: 734
活跃值: (458)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
backahasten 1 2019-3-6 17:21
8
1
大只狼 不懂电路也可以搞这个吗。学过一些,但是都忘了。[em_85]感觉这比windows好找工作些啊
要懂开发的,想逆向啥就要先开发一个类似的,比如我现在搞TI cc2640的一个东西,就要先去看他的开发
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
大只狼 2019-3-6 17:25
9
0
backahasten 要懂开发的,想逆向啥就要先开发一个类似的,比如我现在搞TI cc2640的一个东西,就要先去看他的开发
我只会接下引脚,然后写代码,那些波什么的都不懂
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junkboy 2019-3-6 18:19
10
0
感谢分享  很喜欢这种流水账文章  清晰~
雪    币: 803
活跃值: (850)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
yjmwxwx 2019-3-6 20:39
11
0
学习了,喜欢这样的帖子。
雪    币: 734
活跃值: (458)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
backahasten 1 2019-3-6 22:19
12
0
junkboy 感谢分享 很喜欢这种流水账文章 清晰~
感谢大佬给钱投食
雪    币: 3652
活跃值: (1690)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
comewhere 1 2019-3-7 08:46
13
0
mark
雪    币: 16428
活跃值: (59360)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2019-3-7 09:53
14
0
感谢分享!
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DWwinter 2019-3-7 10:36
15
0
mark
雪    币: 6092
活跃值: (199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuanyouran 2019-3-7 11:06
16
0
感谢分享!
雪    币: 51
活跃值: (538)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
金奔腾 2019-3-7 13:37
17
0
感谢分享!!!
雪    币: 614
活跃值: (1097)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
qqwawzymu 2019-3-7 16:40
18
0
非常厉害,希望楼主再出多一些教程。。。。非常受教了。
雪    币: 1088
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
raax 1 2019-3-7 23:21
19
0
学习了。
雪    币: 83
活跃值: (1037)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2019-3-8 01:28
20
0
学习了 我在等ida7.2呢 看来已经凉了
雪    币: 16110
活跃值: (5876)
能力值: ( LV13,RANK:861 )
在线值:
发帖
回帖
粉丝
大帅锅 4 2019-3-8 13:51
21
0
好文
雪    币: 126
活跃值: (4632)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wsc 2019-3-8 19:06
22
0
好文
雪    币: 77
活跃值: (117)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
aiening 2019-3-9 23:56
23
0
非常感谢无私分享!
雪    币: 226
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雨夜听风 2019-3-11 19:02
24
0
还可以做 sig文件 做匹配哦
雪    币: 279
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
zzjAdmir 2019-3-14 10:55
25
0
新手求指导,“我们可以在每个0x2对齐的位置去按C(因为Thumb指令是0x2对齐的),让IDA Pro强行反汇编”,这个0x2对齐的位置指的是什么位置,可以截图举例下吗?谢谢
游客
登录 | 注册 方可回帖
返回