Ikhtisar keamanan perangkat lunak prosesor S905X (boot aman)

Artikel ini akan membahas perlindungan perangkat lunak pada prosesor S905X. Tujuan utamanya adalah meluncurkan perangkat lunak yang tidak sah.

S905X


Prosesor S905X adalah ARM Cortex-A53 dengan frekuensi clock hingga 1,5 GHz, diisi dengan semua jenis decoder untuk stream video dan audio, seperti H.265 4K, VP9, ​​mendukung 4KUHD, dll. Secara umum, bukan pilihan yang buruk. Tidak seperti pendahulunya, AMLogic mengintegrasikan apa yang disebut "sistem keamanan Advanced TrustZone" ke dalam prosesor ini, yang mengontrol semua operasi sistem kritis, seperti mengakses area memori ROM yang dilindungi, memeriksa tanda tangan dan mendekripsi perangkat lunak, dll. Dokumentasi terperinci tentang topik ini dapat ditemukan di situs web produsen . SecureOS bertindak sebagai ATOS-V1.5-g3e467d9 (saya tidak akan menegaskan, saya tidak memeriksa).

Latihan


Setelah membongkar awalan, saya dengan mudah menemukan pin RxD, TxD dan GND untuk UART. Di sisi sebaliknya ada konektor untuk tombol reset (tidak diverifikasi) dan tempat untuk konektor. Dilihat dari lokasinya, konektornya terlihat seperti papan-ke-papan untuk kartu eMMS alternatif (pinout secara alami tidak ada).



Dokumentasi yang dapat diakses secara bebas untuk S905 mencakup topik-topik penting seperti, misalnya, urutan booting, sedikit kurang lengkap dan praktis tidak berguna dari sudut pandang RE. Mengesampingkan dokumentasi, saya menghubungkan UART dan ... sangat terkejut dengan kecepatan pemuatan prosesor. Tapi mungkin itu saja. U-Boot sama sekali tidak bereaksi terhadap keyboard dan, setelah beberapa pengaturan perangkat keras, dimuat dengan cerdas dan meluncurkan kernel Android.

Log booting 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 ...


Perlu dicatat bahwa U-Boot (bl33) sendiri sudah berjalan di lingkungan "dunia normal" (BL3-1 segera mengubah mode sebelum mentransfer kontrol ke sana). Itu bahkan jika kita mengendalikan U-Boot, kita hanya akan memiliki akses terbatas ke sistem. Pada prinsipnya, ini tidak begitu penting. Setelah semua, bahkan jika Anda menghapus ROM dump, cabut kunci AES dan buka RSA dari sekering, maka tidak akan ada perasaan besar dari ini, karena masih belum ada kunci pribadi RSA.

U-Boot sendiri tidak membaca kunci apa pun. Dia memasukkan kernel ke dalam memori dan memanggil Security Monitor untuk mendekripsi dan memverifikasi kode. Monitor Keamanan melakukan semua yang diperlukan dan menyuruh U-Boot untuk memuat kernel atau tidak. Secara umum, pendekatan yang serius untuk perlindungan perangkat lunak dengan TrustedOS sendiri dan beberapa jenis fungsi seperti BIOS.

Rencana saya selanjutnya adalah mengakses memori eMMC.

EMMC


Untuk terhubung ke eMMC, perlu untuk menemukan setidaknya DAT_0, CLK, CMD dan pin GND. Dan juga mencari tahu pada tegangan apa controller eMMC bekerja (1V8 atau 3V3). Tidak mungkin untuk melakukan ini secara visual dan untuk melacak jejak saya mengeluarkan eMMC sendiri. Karena chip ada di tangan saya, setelah melacak saya menghubungkannya ke adaptor dan membuang dump penuh. Sayangnya, saya tidak memiliki peralatan profesional dan saya menggunakan bahan improvisasi untuk ini. Hasilnya adalah "Bug Mati".


Ya, sebenarnya pinout dari konektor:



Setelah pinout selesai, saya melihat bagaimana prosesor berperilaku tanpa eMMC. Dilihat oleh log, ROM setelah upaya gagal untuk boot dari eMMC mencoba memuat kode dari kartu mSD. Ini membesarkan hati. Saya dengan cepat mengunggah dump ke kartu mSD dan menyalakan konsol. Kejutan kecil menanti saya di sini. ROM mengunduh kode BL2 dari kartu dan mentransfer kendali padanya (itu berarti bagian "boot" pada eMMC tidak terlibat dan tidak perlu akses root). Nah, ketika giliran datang ke U-Boot, dia mengeluh beberapa kali tentang kurangnya eMMC (dev 1) dan untuk waktu yang lama tanpa berpikir dia berhenti di terminal.

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#

Sebagai permulaan, itu tidak buruk sama sekali. Setelah beberapa percobaan dengan terminal, saya menambahkan parameter bootdelay = 5 ke bagian "env", menghitung checksum baru dan menyolder kembali eMMC. Dengan opsi baru, saya berharap U-Boot bisa dihentikan. Namun dalam praktiknya, semuanya berbeda. Tampaknya U-Boot tidak tertarik pada parameter ini dan proses boot tidak berbeda dari yang biasa. Menyedihkan, karena terminal dengan eMMC terhubung diperlukan bagi saya untuk tindakan lebih lanjut. Dengan sedikit berpikir, saya menutup DAT_0 ke ground dan memasukkan kartu mSD saya. ROM sekarang tidak dapat memuat kode dari eMMC dan beralih ke mSD. Setelah memuat U-Boot dengan cara ini, saya membuka kontak dan bertanya:

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 tidak tahan dan dengan senang hati beralih ke eMMC. Saya melihat, tentu saja, apa yang ada di parameter bootdelay. Dan bukannya lima saya, saya melihat di sana lagi 0. Tampaknya U-Boot di beberapa titik menuliskan 0 di sana, jika seseorang tiba-tiba mengubah sesuatu di sana. Tapi itu tidak menarik minat saya lagi dan topik dengan eMMC ditutup.

Catatan: memiliki pinout konektor, Anda dapat terhubung ke eMMC tanpa menyolder chip. Untuk melakukan ini, Anda memerlukan adaptor khusus dengan konverter tegangan, karena Kontroler eMMC berjalan pada 1V8 dan jika Anda menghubungkan adaptor SD biasa ke 3V3, ada risiko komponen terbakar tergeletak di bus 1V8.

Ini juga akan diperlukan untuk menghapus resistor ini, jika tidak prosesor akan mengganggu adaptor.


Komponen tidak ada


Memiliki akses penuh ke terminal U-Boot, saya harus melakukan dua hal: buka kotak set-top DeviceTree dan meyakinkan U-Boot untuk meninggalkan layanan Monitor Keamanan terkait dengan verifikasi kernel. Untuk peluncuran pertama, alangkah baiknya memiliki kernel asli, agar tidak membuang waktu untuk debugging yang baru.

Sangat mudah untuk mendapatkan DeviceTree. Saya bertanya:

gxl_sx6b6x_768_v2#emmc dtb_read 0x1000000 0x40000

read emmc dtb
gxl_sx6b6x_768_v2#

dan dia ada di sakuku.

U-Boot membutuhkan analisis terperinci. Dari log itu diikuti bahwa U-Boot itu sendiri dimuat dan didekripsi pada awalnya di 0x1000000, dan kemudian ditransfer sendiri ke 0x36ES8000 (offset). Saya membuang U-Boot dan menganalisisnya di IDA.

Tentu saja, saya tertarik pada tempat Monitor Keamanan diakses dari perintah bootm. Di


sinilah
X0 - AML_D_P_IMG_DECRYPT
X1 - nLoadAddr
X2 - GXB_IMG_SIZE
X3 - GXB_IMG_DEC_ALL

Untuk menghapus dump kernel asli, Anda harus memuatnya ke memori melalui fungsi imgread dan memodifikasi bootm sehingga segera setelah memanggil memori aml_sec_boot_check dikeluarkan mulai dari alamat 0x1080000 ke terminal (ini tentu bukan satu-satunya cara). Untuk melakukan ini, saya menulis sepotong kode dan mengunduhnya ke tempat yang tepat. Inilah yang terjadi (tentu saja, saya tidak bisa memberikan log lengkap):

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!

Selain kernel, saya juga dapat ramdisk (bisa berguna jika ada driver atau firmware penting, misalnya untuk WiFi).

Saya bukan Android lagi


Untuk peluncuran pertama perangkat lunak saya, saya membuat uImage dari kernel asli, membangun rootfs saya berdasarkan Busybox dan menggunakan dtb saya sendiri. Saya memuat ketiga bagian secara langsung dari drive USB dan menjalankan perintah "bootm", menonaktifkan dekripsi dan verifikasi gambar sebelumnya.

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


Karena fakta bahwa U-Boot diimunisasi terhadap perubahan parameter env (ini terkait tidak hanya "bootdelay"), tidak mungkin untuk mempengaruhi proses booting melalui env, dan untuk memuat perangkat lunaknya, awalan harus terhubung ke komputer. Opsi ini sama sekali tidak cocok untukku. Setelah menganalisis seluruh rantai pemuatan, perintah ini menarik perhatian saya:

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

khususnya:

imgread pic logo bootup $loadaddr

di mana U-Boot sedang memuat sumber daya "bootup" tertentu di alamat loadaddr = 0x1080000. Sumber daya itu sendiri digambarkan oleh struktur seperti itu:

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			*/
}

Tentu saja, parameter "ukuran" dan "mulai" menarik. Melanjutkan dari mereka dan juga parameter "loadaddr", U-Boot menyelesaikan tiga parameter baru untuk membaca langsung dari eMMC. Idealnya, tentu saja, dia mengunggah gambar dari bagian logo di 0x000B00C0 ke memori pada 0x1130000 ... Saya pikir pikiran saya sekarang jelas. Saya memecahkan parameter baru "ukuran" dan "mulai" dan menulis kode saya, yang disimpan di eMMC. Setelah manipulasi seperti itu, U-Boot tidak lagi membaca gambar, tetapi sebuah eksploit, yang segera mendapatkan kendali. Eksploitasi terdiri dari beberapa baris assembler.

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"


Dia membaca uboot.bin dari bagian pertama kartu mSD dan mentransfer kendali ke sana (uboot.bin adalah U-Boot yang belum terenkripsi yang baru saja dikumpulkan. Tentu saja, dimungkinkan untuk menggunakan yang dimodifikasi asli). Ternyata proses boot kembali ke tempat di mana BL3-1 mendekripsi U-Boot asli dan mentransfer kendali ke sana. Hanya saja kali ini, kode yang tidak ditandatangani sudah berjalan. Dan sekarang unduhan dari eMMS terlihat seperti ini (fragmen terakhir):

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
=> 

Kesimpulan


Agar awalan tidak menganggur di rak, saya memutuskan untuk meletakkan LibreElec di atasnya. Gambar yang baru dirakit segera diluncurkan tanpa masalah. Kernel diselesaikan dengan file kecil, driver untuk WiFi dan remote control dipasang, dan fungsi poweroff dikerjakan ulang. Dan semuanya bekerja dengan baik, tetapi kemudian saya ingat bahwa konsol juga mendukung Bluetooth, yang secara alami tidak berfungsi di LibreElec. Meskipun saya tidak membutuhkannya, saya masih memutuskan untuk mengaturnya untuk melengkapi gambar.
Di dalamnya ada chip AP6255 Ampak, yang bertanggung jawab untuk WiFi dan Bluetooth. Bluetooth UART terhubung ke ttyS1, tetapi chip tidak menanggapi perintah HCI dan berpura-pura mati. Selain itu, pada inti asli, chip, seperti yang diharapkan, merespons tim.
Dokumentasi untuk chip ini sangat buruk dan semua yang bisa diekstraksi dari ada pinout. Pertama-tama, saya memeriksa kekuatan chip dan pin BT_WAKE. Semuanya normal. Setelah bereksperimen dengan driver itu sendiri dan port ttyS1, saya tidak mendapatkan hasil apa pun - chip itu diam sebagai partisan dan saya menghubungkan osiloskop ke sana. Di dalamnya saya memeriksa dan membandingkan semua sinyal UART elektronik (RTS, TXD, RXD, CTS). Semuanya normal. Selanjutnya, saya memeriksa urutan reset, yang dikontrol melalui rfkill (ini adalah pin BT_WAKE dan BT_REGON). Tapi di sini semuanya baik-baik saja. Kemudian saya memeriksa pin LPO, di mana menurut dokumentasi sinyal dengan frekuensi 32.768 KHz harus masuk, tetapi bahkan di sini saya melihat sinyal pada osiloskop. Secara umum, semuanya beres, tetapi chip tidak bekerja dengan inti saya. Setelah menghabiskan beberapa hari membongkar driver UART asli, saya kembali ke sinyal PUT dan mengukur frekuensinya.Hasilnya menunjukkan 26KHz. Oh, bagaimana.
Pengandar wifi_dt bertanggung jawab untuk sinyal ini, yang pada intinya saya tidak menghasilkan frekuensi dengan benar. Saya membongkar driver asli dan mengambil alih inisialisasi sinyal PWM dari sana dan ... chip hidup kembali (kemudian saya menemukan versi driver ini dengan sinyal yang benar). Jadi, chip sudah siap untuk penyetelan lebih lanjut, tapi saya tidak tahu bagaimana membuatnya waspada, karena Saya tidak menemukan driver / firmware / dokumentasi untuk itu. Di Android asli, tidak ada apa pun di log kernel kecuali rfkill saat bekerja dengan Bluetooth. Ini bisa dimengerti, karena tidak ada driver kernel, dan peluncuran berlangsung di tingkat pengguna. Entah bagaimana perlu untuk masuk ke log Android itu sendiri, dan untuk ini, akses root ke perangkat diperlukan. Untuk melakukan ini, dalam kenaifan saya, saya menambahkan pengaturan yang diperlukan ke bagian sistem dan menyalakan adb.Tetapi dengan skenario ini, Android memperhatikan ada sesuatu yang salah dan menolak untuk memulai sama sekali, merujuk pada beberapa manipulasi di sana ... Ya, tidak, tidak. Saya memulihkan partisi sistem dan memudarkan rootfs dengan hanya memasukkan sh di sana. Setelah peluncuran berikutnya, saya memiliki akses root di terminal.
Ini adalah bagaimana chip diinisialisasi.

5759  5781 I bt_hci_h4: hal_open
5759  5781 I bt_userial_vendor: userial vendor open: opening /dev/ttyS1
5759  5781 E bt_userial_vendor: userial vendor open success!!
5759  5781 I bt_userial_vendor: device fd = 52 open
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 2000000
5759  5781 I bt_hwcfg: FW prepatch file: /etc/bluetooth/4335/bcm4335_prepatch.hcd
5759  5781 I bt_hwcfg: bt vendor lib: loading prepatch /etc/bluetooth/4335/bcm4335_prepatch.hcd
5759  5781 D bt_hwcfg: Chipset BCM4335A0
5759  5781 D bt_hwcfg: Target name = [BCM4335A0]
5759  5781 I bt_hwcfg: FW patchfile: /etc/bluetooth/4335/bcm4335.hcd
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 115200
5759  5781 D bt_hwcfg: Settlement delay -- 200 ms
5759  5781 I bt_hwcfg: Setting fw settlement delay to 200 
5759  5781 I bt_hwcfg: bt vendor lib: set UART baud 2000000
5759  5781 I bt_hwcfg: Setting local bd addr to 22:22:99:F7:B6:BD
5759  5781 I bt_hwcfg: vendor lib fwcfg completed


Informasi ini cukup untuk menulis program yang melakukan hal yang sama. Langkah terakhir adalah meluncurkan hciattach dan LibreElec mengenali Bluetooth dengan benar. Sekarang perangkat telah sepenuhnya dikonfigurasi. Jika ada yang tertarik, inilah gambar yang sudah jadi.

All Articles