在固件中查找实际的 Thumb 代码

逆向工程 拆卸 二元分析 固件
2021-07-04 04:55:14

我打算购买我的第一个机械键盘,KBT Poker II,除了它的物理特性之外,另一个引起我注意的是它带有可刷新固件!逆向和破解固件将是一个有趣的个人项目。(不幸的是,闪光灯仅适用于窗户......我不确定如何处理,但这是另一个问题。)

可悲的是,当我尝试查看固件文件时,我无法理解它——我尝试在它的某些部分运行一些 Thumb 反汇编程序(以及自己编写以了解有关 Thumb 的更多信息)包含代码(在 hexdump 检查时),但据我所知,它们都提出了垃圾指令——当然没有函数序言/尾声,到处都有很多疯狂的即时消息以及荒谬的转变和 LDM。

键盘内部硬件的一些技术信息:它是围绕Nuvoton NUC122SC1AN 构建的,它具有 Cortex-M0 CPU。有问题的固件文件在此论坛帖子的附件中提供(由键盘制造商提供)。

已经发现了,但是,是位于中断表$0000--its长度完全匹配的一个记录ARM的网站,其中的IRQ 0..31的。然而,这里的另一个奇怪之处是它们都指向高端内存中的中断——$ffff_fff00等等。这个区域不包括在 NUC122 的内存映射中,ARM 的规范将它作为“保留”,但我猜它可能被映射到一些包含芯片闪烁接收代码等的内部存储器,然后中断要么蹦床到用户(固件)代码,要么表被固件提供的中断处理程序覆盖。无论如何,一旦我有一些代码要查看,我可能就能弄清楚。

我试过对文件进行 binwalk 处理,结果发现所有文件都是空的。

需要明确的是,在这里的答案中寻找的是在上述固件文件之一(由制造商本身提供,因此这里不应该有法律问题)中找到实际可执行代码的位置的指导,因为我我真的不明白。我应该补充一点,我对倒车世界还比较陌生。谢谢!

1个回答

我下载了您引用的存档,我注意到的第一件事是固件文件在 0x80 - 0xff 范围内非常重。反转每个字节会导致更好的字节分布,看起来它有一些结构,但仍然不太正确。我假设由于他们尽可能地反转字节,他们可能已经进行了一些位操作,例如 XOR。

由于此文件是固件更新,因此通常会有页眉或页脚。看起来有一个偏移量的标题或其他东西,但没有任何意义。进一步滚动文件,大约字节 35000,似乎有一个结构化数据块,然后是一个 0xff 块,然后是一个 16 字节的“页脚”:

003F1F0: 84 95 74 64 B4 63 13 14 00 00 00 00 3C DC C5 6C   ..td.c......<...

前 8 个字节看起来是个不错的起点。通过一些常见的 XOR 策略,结果一无所获。然后我注意到这些字节具有 3、4 或 5 的低半字节,这会将它们置于可打印的 ASCII 范围内。所以交换每个字节的半字节(又名旋转左 4 位)......:

003F1F0: 48 59 47 46 4B 36 31 41 00 00 00 00 C3 CD 5C C6   HYGFK61A........

答对了!由于固件更新程序窗口标题是“HY USB Firmware Downloader”,我认为这是一个赢家。将生成的文件加载到 IDA、Cortex M-0 Thumb 2 设置中,果然,我们有从偏移量 0x0120 开始的有效代码和偏移量 0x32121 处的 ASCII 字符串块。

总结:通过处理每个字节来解码 .bin 文件:

rotate left 4 bits and invert:  
c = (((c & 0x0f) << 4) | ((c & 0xf0) >> 4)) ^ 0xff