文章

西湖论剑2022-系统镜像

西湖论剑-系统镜像

FIT镜像

FIT镜像是一种uboot启动的镜像文件,包括了linux kernel,ramdisk,device tree三部分。最开始uboot使用的是原始的镜像文件Image,后来采用压缩后的zImage,由于手动输镜像启动参数比较麻烦,于是诞生了uImage(Legacy uImage),一种自带启动参数的镜像,而FIT image则是考虑到设备树的原因对uImage做了优化,于是FIT image诞生了。

参考文章

secure boot (一)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启动。

u-boot/hatlab,gateboard-one.env at 6457f8b7506a25b88b310884b614ee9b95a22176 · DasSecurity-HatLab/u-boot

虽然没有2021西湖论剑的资料,但是可以猜测itb文件应该也是保存在某个分区中,只不过分区名字正好叫kernel

ITB文件

上面提到过dtb文件是设备树源码经过编译得到的,但是itb文件是什么呢?经过试验发现itb文件和dtb文件都可以被dtc反编译,itb对应者its,dtb对应着dts,区别是dts是没有被压缩的,可以看到具体的明文信息,可以简单的修改bootargs为/bin/sh

Untitled

而its则相当于dts将data置换成原始的fdt数据

Untitled

所以总的来看,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的修改如下

Untitled

编译成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的信息

Untitled

此外经过测试发现,u盘格式如果为ntfs刷写会出现block的问题,但是如果为fat32格式的则可以正常刷入。最后刷入后就可以拿到shell了。

参考链接

如何直接修改image.ub_newuart的博客-CSDN博客

使用U-Boot的mkimage制作FIT镜像或给镜像加协议头_kunkliu的博客-CSDN博客

学习整理:uboot its文件

linux ramdisk 参数问题 - sammei - 博客园

License:  CC BY 4.0