C-sky CPU逆向工程

逆向工程 艾达 拆卸 嵌入式
2021-06-25 06:54:25

我正在尝试为 TV STB 重新编写固件,它基于 GX3201 芯片,该芯片基于 C-sky CPU(我认为是 CK610M)。

我被困在以下几点:

  • 我无法正确识别 CPU 架构(可能是 MIPS)。
  • 我无法正确识别复位向量地址以在 IDA pro 中加载引导加载程序。

有人对这些芯片有经验吗?

更新

更新 2

使用 CPU 的工具链并反汇编vectors.o在 lib 目录中找到的内容给了我:

00000458 <__reset_vector>: 
458:    711b lrw        r1, 0xA2A25441 
45a:    0f21 cmpne      r1, r2 
45c:    e802 bf         0x462 
45e:    1082 mfcr       r2, ss2 
460:    1093 mfcr       r3, ss3 
00000462 <skip_SS_ATAG>: 
462:    0f21 cmpne      r1, r2 
464:    e003 bt         0x46c 
466:    7218 lrw        r2, 0x0 // from address pool at 0x4c8 
468:    35f3 bseti      r3, r3, 31 
46a:    9302 st r3, (r2, 0)

objdump -i 输出 :

elf32-csky-big
 (header big endian, data big endian)
  csky
elf32-csky-little
 (header little endian, data little endian)
  csky
elf32-little
 (header little endian, data little endian)
  csky
elf32-big
 (header big endian, data big endian)
  csky
srec
 (header endianness unknown, data endianness unknown)
  csky
symbolsrec
 (header endianness unknown, data endianness unknown)
  csky
verilog
 (header endianness unknown, data endianness unknown)
  csky
tekhex
 (header endianness unknown, data endianness unknown)
  csky
binary
 (header endianness unknown, data endianness unknown)
  csky
ihex
 (header endianness unknown, data endianness unknown)
  csky

 elf32-csky-big elf32-csky-little elf32-little elf32-big srec 
 csky elf32-csky-big elf32-csky-little elf32-little elf32-big srec   

 symbolsrec verilog tekhex binary ihex csky symbolsrec verilog tekhex binary ihex 
2个回答

这个芯片很可能确实是MIPS,所以任何MIPS反汇编器都应该可以工作。请记住尝试小端和大端变体。要找到入口点,请参见此处:逆向工程 MIPS 引导加载程序

注意有可能是固件被打包或加密了(查看binwalk的熵分析);在这种情况下,可能需要直接从闪存芯片中读取它。

编辑:所以,显然代码毕竟不是MIPS。通过 objdump 输出,指令集似乎是摩托罗拉/飞思卡尔 MCORE(以前的摩托罗拉 RCE)的衍生物,即使他们称之为“csky”。您应该能够通过向 objdump 指定二进制文件格式和体系结构来反汇编原始二进制文件,例如:

objdump -D -b binary -m csky file.bin

如果您没有得到好的结果,请尝试添加-EB-EL强制大端或小端反汇编。请注意,有时您可能会在数据与代码混合的情况下进行无意义的反汇编(-D强制反汇编整个文件)。

EDIT2:C-sky 支持已添加到官方 binutils 源代码树中。提交消息说:

V1 源自 MCore 架构,而 V2 则大不相同,具有混合的 16 位和 32 位指令、更大的寄存器集、不同(但重叠)的 ABI 等。

EDIT3在 Radare2 逆向工程框架中添加C-SKY 和摩托罗拉 MCore 架构支持您可以将它与-a mcoreradare2 开关一起使用,它也应该直接识别ELF 文件中的架构。

为了澄清这个线程:

C-Sky CPU 是 SoC 和 PoC 封装中的 16/32 位可变长度指令集 ISA,看起来类似于 MIPS,可以切换为以大端或小端方式执行代码。CK610M 是 v1 ISA,它具有 MMU,因此它能够运行 Linux,其中包含自 v4.19 起的支持。

目前(自 2018 年 10 月以来)有一个价值 6 美元的 C-Sky 开发 SBC 支持 NationalChip 生产的 gx6605s SoC 封装中的 CK610M。QEMU 支持启动 C-SKY v1 和 v2 ISA。

https://c-sky.github.io/docs/gx6605s.html