IDA pro 6.8 反汇编galaxy s6 sboot 的问题

逆向工程 艾达 安卓 手臂
2021-06-28 00:31:02

我对 Galaxy S6 引导加载程序 ( sboot.bin)有一些问题

0x3F000该文件中,我认为存在真正的引导加载程序。

所以我尝试用ida 6.8 pro(64位)反汇编

但它没有拆解清楚。(拇指模式和手臂模式)

IDA pro 6.8 能否支持 Galaxy S6 引导加载程序 ( sboot.bin)?

有没有人成功拆解过 Galaxy S6 引导加载程序(sboot.bin)?(又名 armv8,aarch64 架构)

2个回答

Quarkslab 的 Fernand Lone Sang 成功地反汇编了 S6 引导加载程序(ARMv8、AArch64):

SBOOT 的基地址是0x02102000通过执行这个 python 脚本确定的:

import sys
import string
import struct

RT_SVC_DESC_FORMAT  = "BBB5xQQQ"
RT_SVC_DESC_SIZE    = struct.calcsize(RT_SVC_DESC_FORMAT)
RT_SVC_DESC_OFFSET  = 0xcb50
RT_SVC_DESC_ENTRIES = (0xcc10 - 0xcb50) / RT_SVC_DESC_SIZE

if len(sys.argv) != 2:
    print("usage: %s <sboot.bin>" % sys.argv[0])
    sys.exit(1)

sboot_file = open(sys.argv[1], "rb")
sboot_data = sboot_file.read()

rt_svc_desc = []
for idx in range(RT_SVC_DESC_ENTRIES):
    start = RT_SVC_DESC_OFFSET + (idx << 5)
    desc = struct.unpack(RT_SVC_DESC_FORMAT,
                         sboot_data[start:start+RT_SVC_DESC_SIZE])
    rt_svc_desc.append(desc)

strlen = lambda x: 1 + strlen(x[1:]) if x and x[0] in string.printable else 0

for base_addr in range(0x2100000, 0x21fffff, 0x1000):
    names = []
    print("[+] testing base address %08x" % base_addr)
    for desc in rt_svc_desc:
        offset = desc[3] - base_addr
        if offset < 0:
            sys.exit(0)
        name_len = strlen(sboot_data[offset:])
        if not name_len:
            break
        names.append(sboot_data[offset:offset+name_len])
    if len(names) == RT_SVC_DESC_ENTRIES:
        print("[!] w00t!!! base address is %08x" % base_addr)
        print("    found names: %s" % ", ".join(names))

它是一个 ARM64 二进制文件。如果我们查看同一个 sboot.bin,它实际上是从偏移 10 开始的:

0x00000000      0x00000010      DCD 0x10        ; ^P
0x00000004      0xe99c208a      DCD 0xe99c208a  ; <8A> <9C><E9>
0x00000008      0x00000000      DCD 0x0 ; 
0x0000000c      0x00000000      DCD 0x0 ; 
0x00000010      0x14000002      B 0x18
        -------------------------------
0x00000014      0x14000000      B 0x14
        -------------------------------
0x00000018      0x58000a80      LDR X0, #336            ; 0x168
0x0000001c      0xb9400000      LDR W0, [X0, #0]
0x00000020      0xd2b00001      MOVZ X1, 0x8000, LSL #16

尝试使用 disarm ( http://newosxbook.com/tools/disarm.html ) 因为 IDA 不知何故在处理这个文件时遇到了问题。(显然也有接近尾声的 ARM32 位)