我通常做什么:
- 以不太小的基地址加载二进制文件,例如
0x10000000.
- 标识尽可能多的函数和字符串。
- 您可能会很幸运,只从字符串开始,这通常会减少工作量。
- 创建所有常量值、立即数和双字(假设为 32 位二进制)值的列表。
- 现在对函数和字符串地址列表进行排序,并计算每个连续地址之间的差异。
- 对常量值列表执行相同的操作。
现在您有两个地址差异列表,如果您在两个列表中找到一系列连续差异,您就找到了基地址。
这在大多数情况下都有效,但您可能会遇到两个列表可能都不完整的问题。例如地址列表不会有每个函数的绝对指针,或者你可能错误地反汇编了一些函数。也许专注于字符串地址会有更好的运气。
我通常vim使用正则表达式搜索手动执行此列表匹配。在某些情况下,我编写了一些小脚本来帮助查找匹配项。...但我现在找不到那些,如果我再次找到它们,我会更新我的帖子。
正在讨论的固件文件:来自dvdo 的DVDO Matrix6 Firmware 01.01。
我查看了来自同一站点的其他二进制文件,并找到了对LPC1758- 基于 ARM 的芯片的引用。
事实上,IDA 不会立即识别二进制文件。原因是这个二进制文件只有 Thumb 指令。IDA 期望 arm 二进制文件以 ARM32 代码开头。Thumb 代码可以从十六进制转储中通过字节序列70 47(如(BX LR)、00 bf(NOP)、*0 b5(PUSH {...}
因此,在将段类型更改T为1using 之后Alt-G。我可以反汇编文件。
查找偏移量:
这两个命令将生成文件中出现的双字列表和文件中出现的字符串列表:
od -Ax -t x4 Matrix6_Version_01/M6FW0101.BIN | perl -pe 's/^\w+\s+//' | tr " " "\n" | sort|uniq > dwordlist.txt
strings -10 -o -t x "Matrix6_Version_01/M6FW0101.BIN" > stringlist.txt
现在查看字符串列表中的第一个真实文本:
28eaa pGSAC Initiation task finished
28eca SAC Audio Format Discovery task finished
28ef4 SAC volume has changed
28f0c Audio System Logical Address not assigned
28f37 CBUS MUTE received
28f4b CBUS UN-MUTE received
28f62 CBUS VOL UP received
28f78 CBUS VOL DOWN received
您可能会注意到第一个字符串的前 2 个字符pG实际上是一个70 47orBX LR指令。
现在我将加载两个文件Vim,并在两者中运行这个 vim-perl 脚本:
:perldo s/^\w+/($x,$p)=(hex($&),$x); sprintf("%s(%8x)", $&, $x-$p)/e
这将导致字符串列表部分如下所示:
28eaa( 25dd) pGSAC Initiation task finished
28eca( 20) SAC Audio Format Discovery task finished
28ef4( 2a) SAC volume has changed
28f0c( 18) Audio System Logical Address not assigned
28f37( 2b) CBUS MUTE received
28f4b( 14) CBUS UN-MUTE received
28f62( 17) CBUS VOL UP received
28f78( 16) CBUS VOL DOWN received
现在,跳过前两个,因为不正确的pG开始,我使用这个正则表达式搜索dwordlist.txt,分别搜索连续的2a、18和2b 行:
/ 2a)\n.* 18)\n.* 2b)
这导致我在两个文件中匹配以下行:
0002ebc3( 80)
0002eeac( 2e9) 28eaa( 25dd) pGSAC Initiation task finished
0002eeca( 1e) 28eca( 20) SAC Audio Format Discovery task finished
0002eef4( 2a) 28ef4( 2a) SAC volume has changed
0002ef0c( 18) 28f0c( 18) Audio System Logical Address not assigned
0002ef37( 2b) 28f37( 2b) CBUS MUTE received
0002ef4b( 14) 28f4b( 14) CBUS UN-MUTE received
0002ef62( 17) 28f62( 17) CBUS VOL UP received
0002ef78( 16) 28f78( 16) CBUS VOL DOWN received
0002ef8c( 14)
从 0x2eeac 中减去 0x28eaa 导致偏移量为0x6000.