1

[原创]固件安全之加载地址分析

 3 years ago
source link: https://bbs.pediy.com/thread-267719.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
[原创]固件安全之加载地址分析-智能设备-看雪论坛-安全社区|安全招聘|bbs.pediy.com

在固件分析中,我们经常需要定位固件的加载地址,尤其是Vxworks或者是Linux kernel加载到内存的地址,来方便逆向工具例如IDA PRO进行正确的反汇编以及字符串引用。在下面的部分,本人将结合几个实例,来介绍我们如何寻找正确的固件加载地址。

在处理器芯片的数据手册中,一般都会描述该处理器的内存布局,包含各种中断表地址,也有加载flash数据的内存地址,这个地址就是我们需要找的固件加载地址,如下所示,0x8000000开始存放着flash数据,分析时候我们只需要设置这个地址即可。

通过UART一般可以获取固件启动的敏感信息,其中可能会包含加载地址,如下所示,然而这个地址虽然是内核固件的加载地址,但是内核是压缩的,内核会解压到另一块内存地址,也就是说还需要找到真正的固件加载地址。

为了获取Linux Kernel解压后的数据,可以使用binwalk -e kernel.bin解出原始的内核镜像。用IDA载入进行分析,注意高亮的地方已经标记出来,0xC0008080,很容易猜到真正的内核固件的加载地址为0xC0008000

这个方法在网上已经很多人已经分享了,主要是利用switch 跳转表,来确定固件的加载地址,这种方法在分析ARM架构的Vxworks使用的较多。

  1. 搜索“switch”:
  2. 找到一个合适的跳转表:

    加载地址即为:(0x20018140-0x8110)&0xfffff000=0x20010000(加载地址一般是0x1000对齐)。

魔数定位法

魔数,即magic number,主要思想是先利用一些特征数,定位到相关函数,然后从相关函数找字符串,通过对字符串地址的修正值来确定固件的加载地址,本质还是需要利用字符串的引用地址。
如下所示,这次的目标是一个uboot,我们要寻找uboot的加载地址:

通过分析源码可以知道IH_MAGIC常量值被多处引用:

选中一个引用该常量的函数:

核心思想是通过字符串的引用地址计算出差值来确定加载地址,使用常量值0x27051956在固件中找到上述函数:

发现好几处引用的地方,数量不多,直接一个个去看,看哪一个比较像该函数。如果遇到IDA识别不出来的地方,应该按“C”转化为汇编代码。

最后找到这个函数,通过源码可知,其中0xA082012C就是字符串" Bad Magic Number\n"引用值。

在字符串窗口搜索字符串 " Bad Magic Number",得到文件偏移地址为0x2F12C 。

固件加载地址为: 0xA082012C-0x2F12C=0xA07F1000

指令定位法

指令定位最后还是利用字符串,但是寻找对应字符串不是用的魔数,而是指令,总所周知,r0作为arm传参的第一个参数,在printf这些函数中,第一个字符串往往是常量区字符串,那么我们就使用这一特征定位到对应的字符串和他的地址,先搜索符合条件的指令:

搜索的结果如下,我们随便找一个” LDR R0, =0x23E1B571”,我们暂且认为0x23E1B571存有一个字符串。

直接在IDA字符串搜索地址后面3位值:517

加载地址很明显了: 0x23E1B571-0x1B571=0x23E00000,总的来说,该方法相对较快,1分钟左右就能出结果,不只arm,mips,ppc都可以用该方法求固件的加载地址。

rbasefind

rbasefind是一款用rust开发的非常高效的固件加载地址爆破工具,使用起来非常简单,源码地址:https://github.com/sgayou/rbasefind

本文简单介绍通过各种方法和技巧获取固件加载地址,包括有一些非常快捷高效的手动方法,还可以使用工具自动化进行暴力破解,希望给大家带来一些技术上的启发。

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班火热招生!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK