Обзор защиты ПО процессора S905X (secured boot)

    В этой статье речь пойдёт о защите програмного обеспечения на процессоре S905X. Конечная цель — запустить неавторизованный софт.

    S905X


    Процессор S905X — это ARM Cortex-A53 с тактовой частотой до 1,5GHz, напичканый всевозможными декодерами для видео и аудио потоков, как например H.265 4K, VP9, поддерживающий 4КUHD и т.д. В общем не самый плохой выбор. В отличии от своего предшествинника, AMLogic встроила в этот процессор так называемую «Advanced TrustZone security system», которая контроллирует все критичиские системные операции, например такие как обращение к защищённым участкам памяти ROM'а, проверку сигнатуры и расшифровку ПО и т.п. Детальную документацию на эту тему можно найти на сайте производителя. В качестве SecureOS выступает ATOS-V1.5-g3e467d9 (утверждать не буду, не проверял).

    Подготовка


    Разобрав приставку, я без труда нашёл пины RxD, TxD и GND для UART. На обратной стороне присутствовали разьём для кнопки reset (не проверено) и место для коннектора. Судя по расположению коннектор был похож на board-to-board для альтернативной карты еММС (распиновка естественно отсутствует).



    Свободная в доступе документация для S905 такие критические темы, как например сиквенция загрузки чуть менее чем полностью не затрагивала и являлась с точки зрения RE практически бесполезной. Отложив документацию, я подключил UART и… был приятно удивлён скоростью загрузки процессора. Но на этом пожалуй всё. U-Boot никак не реагировал на клавиатуру и, после некоторых настроек оборудования шустро грузил и запускал ядро Android'a.

    Лог загрузки U-Boot'a
     GXL:BL1:9ac50e:bb16dc;FEAT:BDFC31BC:0;POC:3;RCY:0;EMMC:0;READ:0;0.0;0.0;CHK:0;
    TE: 351954
    
    BL2 Built : 16:42:36, Nov  3 2016. 
    gxl g3eddb43 - xiaobo.gu@droid05
    
    set vcck to 1120 mv
    set vddee to 1000 mv
    Board ID = 4
    CPU clk: 1200MHz
    DQS-corr enabled
    DDR scramble enabled
    DDR3 chl: Rank0+1 @ 768MHz - FAIL
    DDR3 chl: Rank0 @ 768MHz - PASS
    Rank0: 1024MB(auto)-2T-11
    DataBus test pass!
    AddrBus test pass!
    -s
    Load fip header from eMMC, src: 0x0000c200, des: 0x01400000, size: 0x00004000
    aml log : R2048 check pass!
    New fip structure!
    Load bl30 from eMMC, src: 0x00010200, des: 0x01700000, size: 0x0000d600
    aml log : R2048 check pass!
    Load bl31 from eMMC, src: 0x00020200, des: 0x01700000, size: 0x00015400
    aml log : R2048 check pass!
    Load bl32 from eMMC, src: 0x00038200, des: 0x01700000, size: 0x00035a00
    aml log : R2048 check pass!
    Load bl33 from eMMC, src: 0x00070200, des: 0x01700000, size: 0x000aa200
    aml log : R2048 check pass!
    NOTICE:  BL3-1: v1.0(debug):fb68908
    NOTICE:  BL3-1: Built : 18:30:11, Nov  1 2016
    aml log : bl31 detect secure boot !
    [Image: gxl_v1.1.3154-065f772 2016-09-29 14:08:54 yan.wang@droid05]
    
    OPS=0x84
    
    bc fc af 5f a2 b4 4d 4b 1c 91 59 9f [1.280536 Inits done]
    
    secure task start!
    high task start!
    low task start!
    INFO:    BL3-1: Initializing runtime services
    INFO:    BL3-1: Initializing BL3-2
    INFO:    BL3-2: ATOS-V1.5-g3e467d9 #1 Mon Aug 22 17:11:43 CST 2016 arm
    INFO:    BL3-2: chip version = RevC (21:C - 0:0)
    INFO:    BL3-2: crypto engine DMA
    INFO:    BL3-2: secure time TEE
    INFO:    BL3-1: Preparing for EL3 exit to normal world
    INFO:    BL3-1: Next image address = 0x1000000
    INFO:    BL3-1: Next image spsr = 0x3c9
    
    
    U-Boot 2015.01 (Nov 23 2018 - 15:50:35)
    
    DRAM:  1 GiB
    Relocation Offset is: 36ec8000
    register usb cfg[0][1] = 0000000037f5e258
    [CANVAS]canvas init
    vpu: error: vpu: check dts: FDT_ERR_BADMAGIC, load default parameters
    vpu: clk_level = 7
    vpu: set clk: 666667000Hz, readback: 666660000Hz(0x300)
    vpp: vpp_init
    boot_device_flag : 1
    Nand PHY Ver:1.01.001.0006 (c) 2013 Amlogic Inc.
    init bus_cycle=6, bus_timing=7, system=5.0ns
    reset failed
    get_chip_type and ret:fffffffe
    get_chip_type and ret:fffffffe
    chip detect failed and ret:fffffffe
    nandphy_init failed and ret=0xfffffff1
    MMC:   aml_priv->desc_buf = 0x0000000033ec86b0
    aml_priv->desc_buf = 0x0000000033eca9d0
    SDIO Port B: 0, SDIO Port C: 1
    emmc/sd response timeout, cmd8, status=0x1ff2800
    emmc/sd response timeout, cmd55, status=0x1ff2800
    [mmc_startup] mmc refix success
    [mmc_init] mmc init success
    mmc read lba=0x14000, blocks=0x400
          Amlogic multi-dtb tool
          Multi dtb detected
          Multi dtb tool version: v2 .
          Support 2 dtbs.
            aml_dt soc: gxl platform: sx6b6x variant: 1g
            dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
            dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
          Find match dtb: 0
    start dts,buffer=0000000033ecd270,dt_addr=0000000033ecda70
    parts: 11
    00:      logo	0000000002000000 1
    01:  recovery	0000000002000000 1
    02:       rsv	0000000000800000 1
    03:       tee	0000000000800000 1
    04:     crypt	0000000002000000 1
    05:      misc	0000000002000000 1
    06: instaboot	0000000020000000 1
    07:      boot	0000000002000000 1
    08:    system	0000000050000000 1
    09:     cache	0000000040000000 2
    10:      data	ffffffffffffffff 4
    get_dtb_struct: Get emmc dtb OK!
    overide_emmc_partition_table: overide cache 
    [mmc_get_partition_table] skip partition cache.
    Partition table get from SPL is : 
            name                        offset              size              flag
    ===================================================================================
       0: bootloader                         0            400000                  0
       1: reserved                     2400000           4000000                  0
       2: cache                        6c00000          40000000                  2
       3: env                         47400000            800000                  0
       4: logo                        48400000           2000000                  1
       5: recovery                    4ac00000           2000000                  1
       6: rsv                         4d400000            800000                  1
       7: tee                         4e400000            800000                  1
       8: crypt                       4f400000           2000000                  1
       9: misc                        51c00000           2000000                  1
      10: instaboot                   54400000          20000000                  1
      11: boot                        74c00000           2000000                  1
      12: system                      77400000          50000000                  1
      13: data                        c7c00000         10a400000                  4
    mmc read lba=0x12000, blocks=0x2
    mmc read lba=0x12002, blocks=0x2
    mmc_read_partition_tbl: mmc read partition OK!
    eMMC/TSD partition table have been checked OK!
    mmc env offset: 0x47400000 
    WARNING: 'recovery_from_sdcard' neither in running nor in imported env!
    WARNING: 'recovery_from_udisk' neither in running nor in imported env!
    In:    serial
    Out:   serial
    Err:   serial
    hpd_state=0
    cvbs performance type = 6, table = 0
    [store]To run cmd[emmc dtb_read 0x1000000 0x40000]
    read emmc dtb
          Amlogic multi-dtb tool
          Multi dtb detected
          Multi dtb tool version: v2 .
          Support 2 dtbs.
            aml_dt soc: gxl platform: sx6b6x variant: 1g
            dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
            dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
          Find match dtb: 0
    Net:   dwmac.c9410000
    wipe_data=successful
    wipe_cache=successful
    upgrade_step=2
    [OSD]load fb addr from dts
    [OSD]failed to get fb addr for logo
    [OSD]use default fb_addr parameters
    [OSD]fb_addr for logo: 0x3d800000
    [OSD]load fb addr from dts
    [OSD]failed to get fb addr for logo
    [OSD]use default fb_addr parameters
    [OSD]fb_addr for logo: 0x3d800000
    [CANVAS]addr=0x3d800000 width=3840, height=2160
    amlkey_init() enter!
    [EFUSE_MSG]keynum is 4
    [BL31]: tee size: 0
    [KM]Error:f[key_manage_query_size]L507:key[deviceid] not programed yet
    gpio: pin GPIOAO_2 (gpio 102) value is 1
    get_cpu_id flag_12bit=1
    SARADC channel(0) is 0x3e1.
    SARADC closed.
    Hit Enter or space or Ctrl+C key to stop autoboot -- :  0 
    [imgread]szTimeStamp[2019121002280214]
    [imgread]secureKernelImgSz=0x977000
    aml log : R2048 check pass!
    aml log : R2048 check pass!
    aml log : R2048 check pass!
    ee_gate_off ...
    ## Booting Android Image at 0x01080000 ...
    reloc_addr =33f4d440
    copy done
          Amlogic multi-dtb tool
          Single dtb detected
    load dtb from 0x1000000 ......
       Uncompressing Kernel Image ... OK
       kernel loaded at 0x01080000, end = 0x02258fd0
       Loading Ramdisk to 33d12000, end 33eb6000 ... OK
       Loading Device Tree to 000000001fff3000, end 000000001ffff8f4 ... OK
    signature: 
    fdt_instaboot: no instaboot image
    
    Starting kernel ...
    


    Стоит отметить, что сам U-Boot (bl33) выполнялся уже в среде «normal world» (BL3-1 переключал режим непосредственно перед передачей ему управления). Т.е. даже если взять каким-то образом контроль над U-Boot'ом, то у нас будет только ограниченый доступ к системе. В принципе это и не столь важно. Ведь даже если снять дамп ROM'a, вытащить ключи AES и открытый RSA из фьюза, то большóго толку от этого не будет, т.к. закрытого ключа RSA всё равно нет.

    Сам же U-Boot никакие ключи не читал. Он загружал ядро в память и обращался к Security Monitor'у с просьбой расшифровать и проверить код. Security Monitor делал всё необходимое и говорил U-Boot'у грузить ядро или нет. В общем серьёзный подход к защите ПО с собственной TrustedOS и неким функционалом типа BIOS.

    Мой дальнейший план был получить доступ к памяти eMMC.

    eMMC


    Для подключения к eMMC нужно было найти как минимум пины DAT_0, CLK, CMD и GND. А так же выяснить, на каком напряжении работал контроллер eMMC (1V8 или 3V3). Визуально это было сделать невозможно и для трассировки дорожек я выпаял сам eMMC. Раз уж чип оказался у меня в руках, то после трассировки я подключил его к адаптеру и слил полный дамп. Профессионального оборудования у меня к сожалению не оказалось и я использовал для этого подручные материалы. Получился вот такой вот «Dead Bug».


    Ну и собственно распиновка коннектора:



    После того, как распиновка была сделана, я посмотрел как ведёт себя процессор без eMMС. Судя по логу, ROM после неудачной попытки загрузки с eMMC пробовал грузить код с mSD карты. Это обнадёживало. Я быстренько залил дамп на mSD карту и включил приставку. Тут меня ждал небольшой сюрприз. ROM загрузил код BL2 с карты и передал ему управление (значит раздел «boot» на eMMC не был задействован и в root доступе нужды не было). Ну а когда очередь дошла до U-Boot'а, тот пожаловался пару раз на отсутствие eMMC (dev 1) и долго не думая остановился в терминале.

    cmd store failed 
    Err imgread(L132):Fail to read 0x100000B from part[recovery] at offset 0
    gxl_sx6b6x_768_v2#version
    
    
    U-Boot 2015.01 (Nov 23 2018 - 15:50:35)
    aarch64-none-elf-gcc (crosstool-NG linaro-1.13.1-4.8-2013.11 - Linaro GCC 2013.10) 4.8.3 20131111 (prerelease)
    GNU ld (crosstool-NG linaro-1.13.1-4.8-2013.11 - Linaro GCC 2013.10) 2.23.2.20130610 Linaro 2013.10-4
    gxl_sx6b6x_768_v2#
    

    Для начала это было совсем не плохо. После некоторых экспериментов с терминалом, я добавил параметр bootdelay=5 в раздел «env», посчитал новую контрольную сумму и припаял eMMC обратно. С новым параметром я надеялся, что U-Boot можно будет остановить. Но на практике всё было иначе. Похоже U-Boot никак этим параметром не интересовался и процесс загрузки ничем не отличался от штатного. Печально, т.к. терминал с подключенным eMMC был необходим мне для дальнейших действий. Немного поразмыслив, я замкнул DAT_0 на массу и вставил свою mSD карту. ROM теперь не мог грузить код с eMMC и переключался на mSD. Загрузив таким образом U-Boot, я разомкнул контакты и задал:

    gxl_sx6b6x_768_v2#mmc dev 1
    
    emmc/sd response timeout, cmd8, status=0x1ff2800
    emmc/sd response timeout, cmd55, status=0x1ff2800
    [mmc_startup] mmc refix success
    [mmc_init] mmc init success
    mmc read lba=0x14000, blocks=0x400
          Amlogic multi-dtb tool
          Multi dtb detected
          Multi dtb tool version: v2 .
          Support 2 dtbs.
            aml_dt soc: gxl platform: sx6b6x variant: 1g
            dtb 0 soc: gxl   plat: sx6b6x   vari: 1g
            dtb 1 soc: gxl   plat: sx6b6x   vari: 2g
          Find match dtb: 0
    start dts,buffer=0000000033ee4050,dt_addr=0000000033ee4850
    parts: 11
    00:      logo	0000000002000000 1
    01:  recovery	0000000002000000 1
    02:       rsv	0000000000800000 1
    03:       tee	0000000000800000 1
    04:     crypt	0000000002000000 1
    05:      misc	0000000002000000 1
    06: instaboot	0000000020000000 1
    07:      boot	0000000002000000 1
    08:    system	0000000050000000 1
    09:     cache	0000000040000000 2
    10:      data	ffffffffffffffff 4
    get_dtb_struct: Get emmc dtb OK!
    overide_emmc_partition_table: overide cache 
    [mmc_get_partition_table] skip partition cache.
    Partition table get from SPL is : 
            name                        offset              size              flag
    ===================================================================================
       0: bootloader                         0            400000                  0
       1: reserved                     2400000           4000000                  0
       2: cache                        6c00000          40000000                  2
       3: env                         47400000            800000                  0
       4: logo                        48400000           2000000                  1
       5: recovery                    4ac00000           2000000                  1
       6: rsv                         4d400000            800000                  1
       7: tee                         4e400000            800000                  1
       8: crypt                       4f400000           2000000                  1
       9: misc                        51c00000           2000000                  1
      10: instaboot                   54400000          20000000                  1
      11: boot                        74c00000           2000000                  1
      12: system                      77400000          50000000                  1
      13: data                        c7c00000         10a400000                  4
    mmc read lba=0x12000, blocks=0x2
    mmc read lba=0x12002, blocks=0x2
    mmc_read_partition_tbl: mmc read partition OK!
    eMMC/TSD partition table have been checked OK!
    switch to partitions #0, OK
    mmc1(part 0) is current device
    gxl_sx6b6x_768_v2#
    

    U-Boot не стал сопротивляться и с радостью переключился на eMMC. Я посмотрел, конечно, что было в пареметре bootdelay. И вместо своей пятёрки я увидел там снова 0. Похоже U-Boot в какой то момент записывал туда 0, на тот случай, если вдруг кто-то там что поменяет. Но это меня уже не интересовало и тема с eMMC была закрыта.

    На заметку: имея распиновку коннектора, подключаться к eMMC можно не выпаивая чип. Для этого нужен специальный адаптер с конвертером напряжения, т.к. контроллер eMMC работает на 1V8 и если подключить обыкновенный SD адаптер на 3V3, то есть риск спалить компоненты, лежащие на шине 1V8.

    Также необходимо будет убрать вот этот резистор, иначе процессор будет мешать работе адаптера.


    Недостающие компоненты


    Имея полный доступ к терминалу U-Boot'а, мне нужно было сделать две вещи: добраться до DeviceTree приставки и убедить U-Boot отказаться от услуг Security Monitor'а, касающиеся проверки ядра. Для первого запуска было бы ещё неплохо иметь оригинальное ядро, чтобы не убивать время на отладку нового.

    Заполучить DeviceTree было предельно просто. Я задал:

    gxl_sx6b6x_768_v2#emmc dtb_read 0x1000000 0x40000
    
    read emmc dtb
    gxl_sx6b6x_768_v2#
    

    и он был у меня в кармане.

    U-Boot требовал же детального анализа. Из лога следовало, что сам U-Boot грузился и расшифровывался изначально по адресу 0x1000000, а впоследствии переносил сам себя в 0x36ЕС8000 (offset). Я сделал дамп U-Boot'a и проанализировал его в IDA.

    Конечно меня интересовало то место, где шло обращение к Security Monitor'у из команды bootm. Вот оно


    где
    X0 — AML_D_P_IMG_DECRYPT
    Х1 — nLoadAddr
    Х2 — GXB_IMG_SIZE
    Х3 — GXB_IMG_DEC_ALL

    Чтобы снять дамп оригинально ядра, нужно было загрузить его в память через функцию imgread и модифицировать bootm так, чтобы сразу после вызова aml_sec_boot_check выдавалась память, начиная с адреса 0x1080000 в терминал (это конечно не единственный способ). Для этого я написал кусочек кода и загрузил его в нужное место. Вот что получилось (полный лог, конечно, привести не могу):

    gxl_sx6b6x_768_v2#imgread kernel boot
    
    [imgread]szTimeStamp[2019121002280214]
    [imgread]secureKernelImgSz=0x977000
    gxl_sx6b6x_768_v2#bootm
    
    aml log : R2048 check pass!
    aml log : R2048 check pass!
    aml log : R2048 check pass!
    
    Ready for dumping kernel
    
    41 4e 44 52 4f 49 44 21 20 d8 7b 20 20 20 08 01  | ANDROID!
    

    В придачу к ядру я получил ещё и ramdisk (он может пригодится на тот случай, если там находятся какие-нибудь важные драйвера или прошивки, например для WiFi).

    Я больше не Android


    Для первого запуска своего ПО я сделал из оригинального ядра uImage, собрал на базе Busybox свой rootfs и использовал родной dtb. Все три части я грузил прямо с USB накопителя и запускал командой «bootm», отключив прежде расшифровку и проверку имиджа.

    gxl_sx6b6x_768_v2#usb start
    (Re)start USB...
    USB0:   USB3.0 XHCI init start
    Register 2000140 NbrPorts 2
    Starting the controller
    USB XHCI 1.00
    scanning bus 0 for devices... 2 USB Device(s) found
           scanning usb for storage devices... 1 Storage Device(s) found
    gxl_sx6b6x_768_v2#mw.l 0x37ed240c 0xd2800000
    gxl_sx6b6x_768_v2#fatload usb 0:1 0x1000000 dtb.img
    reading dtb.img
    40960 bytes read in 43 ms (929.7 KiB/s)
    gxl_sx6b6x_768_v2#fatload usb 0:1 0x2000000 uImage
    reading uImage
    8116288 bytes read in 4197 ms (1.8 MiB/s)
    gxl_sx6b6x_768_v2#fatload usb 0:1 0x3000000 rootfs.img.uboot
    reading rootfs.img.uboot
    1041462 bytes read in 563 ms (1.8 MiB/s)
    gxl_sx6b6x_768_v2#bootm 0x2000000 0x3000000 0x1000000
    
    ee_gate_off ...
    ## Booting kernel from Legacy Image at 02000000 ...
       Image Name:   S905X Original
       Image Type:   AArch64 Linux Kernel Image (gzip compressed)
       Data Size:    8116224 Bytes = 7.7 MiB
       Load Address: 01080000
       Entry Point:  01080000
       Verifying Checksum ... OK
    ## Loading init Ramdisk from Legacy Image at 03000000 ...
       Image Name:   Root Filesystem
       Image Type:   AArch64 Linux RAMDisk Image (gzip compressed)
       Data Size:    1041398 Bytes = 1017 KiB
       Load Address: 033d1200
       Entry Point:  033d1200
       Verifying Checksum ... OK
          Amlogic multi-dtb tool
          Single dtb detected
    load dtb from 0x1000000 ......
    ## Flattened Device Tree blob at 01000000
       Booting using the fdt blob at 0x1000000
       Uncompressing Kernel Image ... OK
       kernel loaded at 0x01080000, end = 0x02258fd0
       Loading Ramdisk to 33db8000, end 33eb63f6 ... OK
       Loading Device Tree to 000000001fff3000, end 000000001ffff8f4 ... OK
    fdt_instaboot: no instaboot image
    
    Starting kernel ...
    
    uboot time: 136710682 us
    [    0.000000@0] Initializing cgroup subsys cpu
    [    0.000000@0] Initializing cgroup subsys cpuacct
    [    0.000000@0] Linux version 3.14.29 (build@build2) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ) #1 SMP PREEMPT Thu Sep 12 21:24:53 MSK 2019
    [    0.000000@0] CPU: AArch64 Processor [410fd034] revision 4
    
    [    6.302659@2] meson_uart c81004c0.serial: ttyS0 use xtal(8M) 24000000 change 115200 to 115200
    # cat /proc/cpuinfo
    Processor	: AArch64 Processor rev 4 (aarch64)
    processor	: 0
    processor	: 1
    processor	: 2
    processor	: 3
    Features	: fp asimd evtstrm aes pmull sha1 sha2 crc32 wp half thumb fastmult vfp edsp neon vfpv3 tlsi vfpv4 idiva idivt 
    CPU implementer	: 0x41
    CPU architecture: 8
    CPU variant	: 0x0
    CPU part	: 0xd03
    CPU revision	: 4
    
    Hardware	: Amlogic
    Serial		: 210c84009f59911c4b4db4a25faffcbc
    #
    

    Jailbreak


    В силу того, U-Boot был иммунизирован против изменения env параметров (это касалось не только «bootdelay»), повлиять на процесс загрузки через env было невозможно, а для того, чтобы загрузить своё ПО приставка должна была быть подключена к компьютеру. Такой вариант меня абсолютно не устраивал. Проанализоровав всю цепь загрузки, моё внимание привлекла вот эта команда:

    init_display=osd open;osd clear;imgread pic logo bootup $loadaddr;bmp display $bootup_offset;bmp scale
    

    в частности:

    imgread pic logo bootup $loadaddr
    

    где U-Boot загружал некий ресурс «bootup» по адресу loadaddr=0x1080000. Сам же ресурс описывался вот такой структурой:

    struct resource_header{
    	unsigned int 	magic;		/* Image Header Magic Number	*/
    	unsigned int 	hcrc;		/* Image Header CRC Checksum	*/
    	unsigned int	size;		/* Image Data Size		*/
    	unsigned int	start;		/* item data offset in the image*/
    	unsigned int	end;		/* Entry Point Address		*/
    	unsigned int	next;		/* Next item head offset in the image*/
    	unsigned int	dcrc;		/* Image Data CRC Checksum	*/
    	unsigned char	index;		/* Operating System		*/
    	unsigned char	nums;		/* CPU architecture		*/
    	unsigned char   type;		/* Image Type			*/
    	unsigned char 	comp;		/* Compression Type		*/
    	char 	name[32];		/* Image Name			*/
    }
    

    Интересными были конечно же параметры «size» и «start». Исходя из них и так же параметра «loadaddr», U-Boot вырешивал три новых параметра для прямого чтения с eMMC. В идеале он конечно же загружал картинку из раздела «logo» по адресу 0x000B00C0 в память по адресу 0x1130000… Думаю ход моих мыслей теперь понятен. Я вырешал новые параметры «size» и «start» и написал свой код, который был сохранён на eMMC. После таких манипуляций U-Boot читал уже не картинку, а эксплойт, который сразу получал управление. Эксплойт состоял из нескольких строк на ассемблере.

    LDR X21, printf
    ADR X0, .message
    BLR X21
    
    LDR X21, run_command
    ADR X0, .command
    MOV X1,#0x0
    BLR X21
    
    .align 4
    printf: .quad 0x37EE50A0
    .align 4
    run_command: .quad 0x37EE9BA0
    
    .align 4
    .message: .string "\nJailbreaking BL3-3...\n"
    .align 4
    .command: .string "fatload mmc 0:1 0x1000000 uboot.bin; go 0x1000000"
    


    Он читал uboot.bin из первого раздела mSD карты и передавал ему управление (uboot.bin был свежесобранный нешифрованный U-Boot. Конечно, можно было использовать и родной доработанный). Получается, что процесс загрузки вернулся на то место, где BL3-1 расшифровывал оригинальный U-Boot и передавал ему управление. Только на этот раз выполнялся уже неподписанный код. И теперь загрузка с еММС выглядела уже таким образом (последний фрагмент):

    Hit Enter or space or Ctrl+C key to stop autoboot -- :  0
    
    Jailbreaking BL3-3...
    card in
    [mmc_init] mmc init success
    reading uboot.bin
    408579 bytes read in 28 ms (13.9 MiB/s)
    ## Starting application at 0x01000000 ...
    
    
    U-Boot 2017.11-02414-g9b5924abf2-dirty (Mar 01 2020 - 22:17:58 +0100) p212
    
    DRAM:  1 GiB
    MMC:   mmc@72000: 0, mmc@74000: 1
    reading uboot.env
    In:    serial@4c0
    Out:   serial@4c0
    Err:   serial@4c0
    [BL31]: tee size: 0
    [BL31]: tee size: 0
    Net:   
    Warning: ethernet@c9410000 (eth0) using random MAC address - 22:10:89:5b:74:85
    eth0: ethernet@c9410000
    Hit any key to stop autoboot:  2 0
    => version
    U-Boot 2017.11-02414-g9b5924abf2-dirty (Mar 01 2020 - 22:17:58 +0100) p212
    
    aarch64-elf-gcc (Linaro GCC 7.2-2017.11) 7.2.1 20171011
    GNU ld (Linaro_Binutils-2017.11) 2.28.2.20170706
    => 
    

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      +3
      Похоже речь о какой-то TV-приставке на базе S905x, но нет никакого упоминания о том, что это конкретно.
        0
        Это не имеет никакого значения, на самом деле.
          0
          Xiaomi Mi Box S на базе S905x, вроде.
          +3
          Восхитительная статья! Просто бомбическая. Совершенно не важно, какая железка ломается, ибо подход универсален!

          Но упущены, по настоящему важные и интересные моменты. Буду рад, если мне на них ответят.
          1. Правильно я понимаю, что eMMC считывался обычным адаптером sd-карт?
          2.
          Заполучить DeviceTree было предельно просто. Я задал:

          gxl_sx6b6x_768_v2#emmc dtb_read 0x1000000 0x40000


          Может я упустил, как были получены адреса и как потом был сохранён файл?

          3. Самое интересное — это кросскомпиляция своего эксплойта, как написан мейкфайл, каким образом компилировался, параметры, ну и конечно просто поглядеть на исходники.

          Просто неоднократно занимался подобным, но опыта мало, а учится не у кого. Спасибо!
            +4
            1) Если будешь выпаивать чип и подключать полностью, то да, обыкновенный. Если только DAT_0, то нужен такой, который поддерживает 1-Bit модус. Если не выпаивать, но нужен конвертер на 1V8. Ну или подключить обыкновенный на свой страх и риск.
            2) emmc dtb_read читает по ходу dtb из какого-то раздела на eMMC. Адрес 0x1000000. Читается потом через md.b 0x1000000 0x40000
            3) Никаких мейкфайлов. Написал на чистом ассемблере. Позже дополню статью сурсом.
              0
              1. Спасибо!!! Про согласование уровней понятно.

              2) emmc dtb_read читает по ходу dtb из какого-то раздела на eMMC. Адрес 0x1000000. Читается потом через md.b 0x1000000 0x40000


              Как получены адреса? И потом просто смотрится дамп? Как-то не очень удобно, думал будет сохранено куда-то. А сам образ карты шифрован?

              3. Это самое ценное и интересное!
                +1
                Какие адреса? emmc dtb_read прочтёт dtb в любой указаный участок памяти. В этом случае 0x1000000. Да, просто смотрится через md и выхлоп собирается скриптом в бинарный файл.
                Разделы «bootloader» и «boot» конечно шифрованы. «logo» и «system» нет. Остальные не проверял.
                  +1
                  Сорян, я просто протупил.

                  Скрипт тоже было бы интересно поглядеть. В общем, самое интересное и важное в статье не показано :))). Очень прошу статеечку «инструментарий», то как писать такие вот эксплойты, всякие скрипты и т.п.
            +1

            Отличная работа!
            А в сторону гуляющего по сети AMLogic flash tool не смотрели? Там, говорят, логин к их FTP в открытом виде лежит, а там всё в лучших китайских традициях — инструменты сборки, ключи итд (хотя может закрыли наконец, это несколько лет назад было, сразу как S905X вышли).

              +1
              Честно говоря нет. Дело в том, что на тестдевайсе был активирован secured boot. И я уверен, что ключи (RSA и AES) только у дистрибьютора.
                +1

                На тот момент «ключи у дистрибьютора» выглядело как «в отдельной папке на общем FTP», бардак у них не только в U-Boot, это системное (оно и вполне ожидаемо, там всё это секьюрити — в основном ради исполнения формальных требований для получения ключей HDCP (они кстати там же валялись), это не носимое устройство).

              0
              Это не эксплоит, а патч.

              ЗЫ: а зачем BLR, если это dead end?

              Only users with full accounts can post comments. Log in, please.