物联网和智能设备这两年仍是比较火的,咱们的手中或多或少都有了几个智能设备,好比手环,智能手表,或者门锁什么之类的东西,可是同窗们在作逆向的时候,却有不少问题。要否则是根本拿不到固件,要否则是拿到了Bin以后看不懂,这篇文章带你们手把手调教IDA pro,让他逆向无符号的Bin文件。linux
先说一下逆向固件的意义把,通常来讲,这种小东西都会和外界有交互,蓝牙,WIFI,网络,4G,zigbee等等,咱们逆向出他的协议就能够发现其中的安全问题。好比若是你逆向了一个手环的协议,发现它没有作身份验证或者验证不严谨,就能够批量的影响手环,或者你搞定了一个网络协议,可能发现一个网络的暴露服务,对云平台发起攻击,等等。windows
咱们固然能够从APP上入手去搞,可是这几年,随着APP加固的大面积使用,难度系数正在上升,而硬件上,特别是M系的MCU,为了成本,运算速度和功耗,不多有使用加密一类防护手段的。STM32系列可使用设置RDP位的方式锁死固件读取,可是这样搞了以后,程序也就没有办法升级了,同时也带来了开发和调试时间上的消耗,面对整分夺秒的市场,使用的仍是不多的。(实际上即使是开了防护也是有方法搞的。。。)安全
在开始搞以前,咱们先了解一下文件的结构。网络
你们熟悉的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比较好用