固件逆向分析1--确定固件加载地址
1、 固件识别和解压
一般先给binwalk,在给file看下文件的格式,确认是data的二进制文件后
直接给binwalk,-e解一遍后,发现zlib格式,进入当前生成的目录中
binwalk -e noe77101.bin
image.png
目录的217正是该固件的起始位置0x217来命名,再给binwalk
image.png能够发现固件中的文件名和版本信息,如 VxWorks WIND kernel version "2.5"
并注意关注这几个地址
0x31EED4 VxWorks symbol table, big endian,
first entry: [type: function, code address: 0x223D64, symbol address: 0x2A8BC8]
2、提取固件加载地址
计算加载地址的方法就是
加载地址 = 符号表中字符串的地址 - 相应字符串在固件中的偏移
嵌入式系统的固件需要到指定内存中的特定位置进行运行,这个特定的位置叫做固件加载地址(base address)
嵌入式系统固件的函数调用地址是基于固件加载地址所计算出的内存位置,而不是固件中的地址
说白了就是要计算出固件加载的内存地址
因此,为了使反汇编工具软件(如IDA Pro)能够正确的分析函数调用关系,我们需要分析出固件加载地址,
否则所有的函数调用关系都将是错误的。
分类:
1、ELF封装的固件文件,在ELF文件的头部有特定的数据位记录了该固件的加载地址,
如果有ELF封装头部,因此我们可以直接读取ELF文件头,从而直接获取到固件的加载地址。
2、如果固件没有封装,要对固件代码进行逆向,从而分析出固件的加载地址。
这个方法比较复杂,针对不同的嵌入式系统及CPU架构都有区别
针对NOE771的固件,并没有ELF封装
我们将通过分析固件头部的代码调用来大致猜测固件的加载地址。
2.1 获取固件CPU架构
再给binwalk ,用-A 获取 CPU架构,该信息有助于选择正确的反汇编引擎
binwalk -A 217 | more
目标固件的CPU架构为PPC
image.png2.2 strings出字符串,找出起始地址
strings 217
image.png
这个应该就是符号表的最后一个(结束)
PPC架构,直接给010editor分析固件地址,定位到 APP_STATION_MODBUS
image.png可知该符号的的起始地址是 298BD8h
image.png在binwalk中可以看出第一个符号表起始位置就是 0x31EED4
定位到该地址上去,发现上方还有字符表,所以字符表起始位置正确的应该是上面一行
image.png符号表在固件中真正的起始位置是 0x31EEC4
所以得出符号表字符串的内存地址为:002A8BD8
字符串是压栈倒序排列,字符串表里面的最后一个字符串 在 符号表的第一项被引用 。
所以这个地址就是前面的最后一个字符串的内存地址
所以加载地址为字符串的内存地址减去字符串地址为:
002A8BD8 - 298BD8h
计算得'0x10000'
hex(0x2A8BD8 - 0x298BD8)
image.png
这就是固件的加载地址
总结
固件加载地址的计算是通过vxworks固件中的函数符号表计算得出的。
在固件中,与函数字符串相关的有两个地址,一个是在固件中字符串的存储地址;另一个是字符串所指向的内存地址。
这两个地址相减,就能得出固件的加载地址。
只需要定位到一个固定的字符串,找到它在固件中的存储地址以及在内存中加载它的地址,就能算出固件的加载地址了。
一般来说,vxwork的固件加载地址是0x10000
固件百度云下载
链接:https://pan.baidu.com/s/1m84ZRb1OLMB5GzmzYfOaGg
提取码:k9ni