西湖论剑-系统镜像
FIT镜像
FIT镜像是一种uboot启动的镜像文件,包括了linux kernel,ramdisk,device tree三部分。最开始uboot使用的是原始的镜像文件Image,后来采用压缩后的zImage,由于手动输镜像启动参数比较麻烦,于是诞生了uImage(Legacy uImage),一种自带启动参数的镜像,而FIT image则是考虑到设备树的原因对uImage做了优化,于是FIT image诞生了。
参考文章
ARM uboot Legacy uImage 和 fit img (Flattened uImage Tree)原理介绍
Linux设备树
DTS,设备树源码,一种描述硬件的数据结构,在一些arm,mips的代码中,存在一个关于板子的细节信息,但是这些信息对于kernel来说是没用的,不然编译出的kernel会过于臃肿。于是提出了设备树的概念,来减少关于板子细节的垃圾代码。
DT : Device Tree
FDT : Flattened Device Tree
OF : Open Firmware
DTS : Device Tree Source
DTSI : Device Tree Source Include
DTB : Device Tree Blob
DTC : Device Tree Compiler
DTC负责将DTS和DTSI编译为DTB然后由bootloader加载。
设备树DTS 学习:1-有关概念 - schips - 博客园
ubuntu使用方法
sudo apt-get install device-tree-compiler
dtc可以将dts编译为dtb,也能将dtb转化为dts
# 反编译dtb为dts
dtc -I dtb -O dts input.dtb -o output.dts
# 编译dts为dtb
dtc -I dts -O dtb input.dts -o output.dtb
通过对dtb进行反编译,然后修改dts后,再进行编译得到修改后的dtb文件
西湖论剑shell获取
由于西湖论剑的设备默认是没有shell的,且通过修改bootargs的方式也行不通,但是可以通过patch启动镜像,在ramdisk阶段修改根文件系统的/etc/shadow文件更改root密码(或者打开ssh?),具体的操作过程需要了解dts,dtb,mkimage等概念及工具。
首先看看2022年的西湖论剑,主办方提供了itb文件,而2021年的西湖论剑则是可以通过dfu-util将kernel分区下载到U盘中。
可以简单分析下uboot的刷写固件的代码,2022年是通过run flash_ubi_usb,将usb中的itb和img刷写到ubi中,然后启动时会尝试通过ubi启动。
虽然没有2021西湖论剑的资料,但是可以猜测itb文件应该也是保存在某个分区中,只不过分区名字正好叫kernel
ITB文件
上面提到过dtb文件是设备树源码经过编译得到的,但是itb文件是什么呢?经过试验发现itb文件和dtb文件都可以被dtc反编译,itb对应者its,dtb对应着dts,区别是dts是没有被压缩的,可以看到具体的明文信息,可以简单的修改bootargs为/bin/sh
而its则相当于dts将data置换成原始的fdt数据
所以总的来看,itb和dtb的区别不是很大,都可以被dtc反编译。
重打包ITB
既然itb和dtb都是一样的话,那么可以通过对itb进行反编译,修改data段为修改后的dtb,然后通过mkimage进行打包即可,对于2022年西湖论剑的itb操作如下:
# mkimage dumpimage dtc 安装
sudo apt-get install u-boot-tools device-tree-compiler
# 提取dtb
dumpimage -T flat_dt hatlab_gateboard-one-kernel.itb -p 2 -o fdt.dtb
# 反编译itb
dtc -I dtb -O dts hatlab_gateboard-one-kernel.itb -o my-kernel.its
# 反编译dtb
dtc -I dtb -O dts fdt.dtb -o fdt.dts
# 修改fdt.dts后重新编译dtb
dtc -I dts -O dtb fdt.dts -o fdt.dtb
# 修改its后重新编译 itb
mkimage -f my-kernel.its my-kernel.itb
对my-kernel.its的修改如下
编译成itb后,根据uboot源码和官方的使用手册,可以知道直接将itb和rootfs放到U盘中,通过run flash_ubi_usb可以将固件刷到flash中。
一些坑
经测试发现,ubuntu22.04 直接通过apt安装u-boot-tools后,使用dumpimage -l xxx.itb并不能获得完整的镜像信息。
但是ubuntu20.04 使用apt安装dumpimage则可以正常显示itb的信息
此外经过测试发现,u盘格式如果为ntfs刷写会出现block的问题,但是如果为fat32格式的则可以正常刷入。最后刷入后就可以拿到shell了。
参考链接
如何直接修改image.ub_newuart的博客-CSDN博客