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

​ 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候,却有很多问题。要不然是根本拿不到固件,要不然是拿到了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比较好用

使用IDA pro逆向ARM M系核心的Bin固件的更多相关文章

  1. 使用IDA Pro逆向C++程序

    使用IDA Pro逆向C++程序 附:中科院李_硕博 : IDA用来做二进制分析还是很强大的 .lib程序是不是很容易分析出源码? 这个得看编译选项是怎么设置的 如果没混淆 没太过优化 大体能恢复源码 ...

  2. IDA Pro - 使用IDA Pro逆向C++程序

    原文地址:Reversing C++ programs with IDA pro and Hex-rays 简介 在假期期间,我花了很多时间学习和逆向用C++写的程序.这是我第一次学习C++逆向,并且 ...

  3. 路由器逆向分析------在Linux上安装IDA Pro

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69665905 01.在Linux系统上安装Linux版本的IDA Pro Linu ...

  4. IDA Pro - 如何得到比较清楚的逆向伪代码

    原文地址:Question about disassembler 简介 这篇文章介绍了如何在不使用插件的IDA Hex-Rays如何得到比较清晰的伪代码.IDA Hex-Rays功能很强大,只要你提供 ...

  5. android调试系列--使用ida pro调试原生程序

    1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:自己编写NDK demo程序进行调试 2.前期准备 2.1  准备样本程序(假设已经配置好 ...

  6. IDA Pro使用技巧

    DA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window). IDA图形视图会有执行流,Yes箭头默认为绿色,No箭头 ...

  7. IDA Pro使用(静态分析+动态调试)

    链接:http://skysider.com/?p=458 IDA Pro使用(静态分析+动态调试) 1.静态分析 IDA FLIRT Signature Database —— 用于识别静态编译的可 ...

  8. IDA Pro基本简介

    IDA Pro基本简介 IDA加载完程序后,3个立即可见的窗口分别为IDA-View,Named,和消息输出窗口(output Window). IDA图形视图会有执行流,Yes箭头默认为绿色,No箭 ...

  9. 关于ida pro的插件keypatch

    关于ida pro的插件keypatch 来源 https://blog.csdn.net/fjh658/article/details/52268907 关于ida pro的牛逼插件keypatch ...

随机推荐

  1. web通信类几个相关知识

    1.什么是同源策略及限制? 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互. 这是一个用于隔离潜在恶意文件的关键安全机制. 所谓同源,就是指两个页面具有相同的协议,主机(也常说 ...

  2. Idea使用插件实现逆向工程搭建SpringBoot项目

    之前写SpringBoot项目,每次都要手动去写实体类.dao层啥的,尤其是数据库表字段特别多的时候,特别麻烦.然后很多小伙伴都会用逆向工程来自动生成这些类,省去许多没必要的代码量,但是Mybatis ...

  3. CCF_ 201409-3_字符串匹配

    水. #include<cstdio> #include<iostream> #include<cstring> using namespace std; int ...

  4. WeChall_Enlightment (Encoding)

    解题: 刚开始一看这题就蒙逼了,完全没思路,过了几天后再仔细去想想,应该是二进制的ascii码,但是原来的三张图虽然都是8的倍数,但完全转换不成有用的东西,题目的意思能否找到光,百度了一下关于三原色的 ...

  5. Docker容器到底是什么?

    Docker是一个开源的应用容器引擎,是近些年最火的技术之一,Docker公司从Docker项目开源之后发家致富把公司商标改为了Docker,收购了fit项目,整合为了docker-compose,前 ...

  6. 小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame

    在家为国家做贡献太无聊,不如跟我一起学点 Python 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Panda ...

  7. Jmeter之下载文件

    前言 我们可以利用postman工具来测试下载文件的接口,那么假如要利用Jmeter工具来进行下载接口的测试,又该如何测试呢? 下载文件的接口地址:/pinter/file/api/download? ...

  8. nginx设置域名转发到指定端口

    1.修改nginx.conf文件,将worker_processes  1 修改为  worker_processes  auto 2.创建端口代理配置文件(域名地址如:xx.baidu.com , ...

  9. 《C/C++实现Console下的加载进度条模拟[美观版]》

    前言   有时候我们会遇到在CMD或DOS控制台上出现的加载进度条,虽然不是如网页和软件写的美观.但确确实实也有着自己的特色.而且,一个好看的加载进度条也能增加用户使用控制台程序的体验!所以,拿来研究 ...

  10. javascript原生js轮播图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...