zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

利用chroot和fake filesystem解决物联网设备研究时的工具移植问题

设备工具 问题 解决 利用 研究 联网 移植
2023-06-13 09:16:08 时间

问题描述

在研究物联网设备时经常会碰到工具缺失的问题。比如我最近在玩的一款物联网设备,该设备基于busybox封装了简单的文件系统,缺少了gdb等研究工具。此外由于文件系统中没有sshd,所以研究过程中也只能通过默认的tty进行交互,非常蛋疼。

设备默认tty和fs环境

传统解决思路

应对这种问题的常规思路是对需要用到的工具进行静态编译,并丢到设备的文件系统中。虽然这种方法可以解决很多工具缺少的问题。然而,并不是所有的工具都是可以成功的静态编译,比如sshd,就很难静态编译成功。

新的思路

我决定尝试了一种新的思路:往设备中丢动态链接的工具并使用fake filesystem解决依赖问题。 具体来说,首先在一个Linux发行版中安装好sshd、gdb等常用工具并将其filesystem打包。接着,将打包好的文件系统解包到设备上。最后,chroot过去,就可以执行sshd、gdb之类的工具了。

fake filesystem

实际例子

这里举一个实际的例子。首先,我们通过以下Dockerfile build一个安装了sshd等常用工具的ubuntu 20.04 docker。

FROM  ubuntu:20.04
ENV TZ=UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN sed -i "s/http:\/\/archive.ubuntu.com/http:\/\/mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list
RUN apt update && apt install -y openssh-server gdb git gcc make cmake
RUN apt install -y openssh-server 
RUN apt install -y gdb git gcc 
RUN apt install -y make cmake

接着,导出其文件系统,并将该文件系统解包到目标设备中。

docker export $container_id  > fakefs.tar

在目标设备上,我们chroot到fakefs中,chroot之后,一些没有特殊依赖的工具软件如gcc、make、gdb等已经可以正常使用了。

由于sshd依赖于/dev/urandom /dev/random /dev/ptmx /dev/pts等设备文件,在运行sshd之前,我们需要首先创建这些文件。

mknod /dev/urandom c 1 9
mknod /dev/random c 1 8
mknod /dev/ptmx c 5 2
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t proc none /proc 

完成之后,就可以运行sshd了。

sshd运行成功之后,我们就可以在自己的pc上ssh到设备上,而不再需要忍受不支持复制粘贴等功能的的默认tty的折磨。

值得注意的是,这样ssh进去之后是chroot环境,要想访问原来的文件系统。使用trick逃逸出来即可。

总结

利用这种方法,可以完成大多数不依赖于具体内核环境的工具移植,甚至可以移植包管理工具并以此安装更多的软件。

使用包管理工具安装更多软件

不过,值得注意的是,由于chroot之后的环境缺少/dev /proc等一些特殊文件系统。因此,对于依赖于这些特殊文件系统的工具(如sshd)来说,需要先解决这些依赖,才能够正常运行。