patch_do_cboot‐SPL_zh - TomKing062/CVE-2022-38694_unlock_bootloader GitHub Wiki
SPL 仅能在 (没有触发按键,所有验证失败的)备用u2s下载模式中启动(人话:擦掉储存中的splloader)。
第 1 部分:修改 FDL1,将修改后的 fdl1 保存为 fdl1-dl.bin
按照程序顺序寻找,如图,从 _start
到 reset
再到 main
(sub_10218)
这里我们看到一系列函数注册,#4 是 data_exec
(sub_10094),现在NOP(1F 20 03 D5)函数中的验证。
第 2 部分:修改 FDL2(uboot/lk)
do_cboot()
2.1 补丁 1:set_lock_status()
搜索 VerifiedBoot-UNLOCK
以找到 set_lock_status
。
set_lock_status() 函数后面第一个函数就是 get_lock_status() 函数。
部分厂商(如:ZTE TECNO BBK)会修改 set_lock_status() / get_lock_status() 来禁止 bootloader 解锁
do_download()、dl_powerdown_device()、power_down_devices()、do_cboot()
无 autodloader 功能的 uboot/lk:搜索 do_download
找到 do_download
,能够看到一系列函数注册,#0x17 是 dl_powerdown_device()
有 autodloader 功能的 uboot/lk:搜索 download mode
找到 download_handler
,或搜索 reply exec act as Romcode
来查找 autodloader_handler
,download_handler
和 autodloader_handler
都会调用 do_download_common
,在 do_download_common
中能够看到一系列函数注册,#0x17 是 dl_powerdown_device()
在 dl_powerdown_device() 中找到 00 00 00 14
(即while 1),while 1
之前的函数是 power_down_devices()。
检查 power_down_devices() 的 被调用 列表,通常第一个调用 power_down_devices() 的函数就是 do_cboot(),记住 do_cboot() 中该代码块的地址。
补丁:
示例:a9/a10 和一些没有用 vab 布局的 a11(+)
示例:a11(+) 且使用 vab 布局:需要在 boot_env_check(检查#0x104参数的语句)之后进行修改
2.2 Patch 2:删除(NOP)安全分区的写入检查
搜索 sml
,在搜索结果中,找到类似 LDR Xm, [Xn],#8 ; "sml"
的代码,修补此函数,禁用检查,让这个函数任何情况都return 1
2.3 保存文件
将补丁 1 应用于原始 FDL2,另存为 fdl2-cboot.bin,将补丁 2 应用于原始 FDL2,另存为 fdl2-dl.bin。
第三部分:修改SPL,将修改后的spl保存为spl-unlock.bin
旧类型
spl加载镜像A B C D并验证,如果验证失败,则从A_bak B_bak C_bak D_bak重新加载A B C D并再次验证。
(修改BL secboot_init
为B loc_F230
,0xF230是BL update_swVersion
之后CMP W19, WZR
的地址)
因此修补了nand_boot,读取分区后跳过验证,直接执行。
新类型
删除 signcheck() 和 signcheck() 的结果检查
nand_boot() 中通常有 4 个 signcheck()
最后一步:准备解锁命令
1.(正常下载)发送 fdl1-dl.bin,发送 fdl2-dl,将 fdl2-cboot 写入 uboot,擦除 splloader
2.(回退下载)发送 spl-unlock.bin
3.(回退下载)发送 fdl1-dl.bin,发送 fdl2-dl,写回官方uboot,写回官方splloader,擦除用户数据。