背景

春季学期刚开学那会(大概是 2 月 20 号左右),brealid 大佬在 LUG 群里发起了拼团买二手红米 2 的邀请。手机的来源是小黄鱼,一台价格 52.4 元,5 台起卖。我寻思着备用机这玩意早晚都是要准备的,现在都有车摆在面前了,没有不上的道理,就找他拼了一台下来。

我跟 brealid 大佬联系的时候,他手上貌似已经刷上了一台,并且已经装好了 docker,成功运行了 2048 的 demo 服务,再加上看了阮行止大佬的博客:https://www.ruanx.net/redmi2-to-debian/,发现刷机过程似乎并不复杂,便天真地以为刷机就是分分钟的事情。

前段时间,我在写 zer0pts CTF 的时候,萌生了想要复现环境的想法,在 Nebula 群里询问的时候突然意识到自己忘了 docker 这个神奇的玩意,而环境可以直接部署在局域网中,而我手上又正好多出来这么个备用机,就把它从垃圾堆里翻了出来,开始折腾起来。

这不折腾不要紧,一折腾差点要了我的命。

Error 1: dtb not found

按照阮行之大佬的步骤:

首先下载刷机包:https://github.com/Project-DragonPi/mobian-wt88047
重启手机,开机时按住「音量 -」和「电源」键,进入 fastboot 模式。电脑上检测确认已连接,并刷入 lk2nd。

成功刷入 lk2nd 之后,我的手机变砖了。被逼无奈之下,我尝试在 fastboot 模式下直接启动 lk2nd:

1
$ fastboot boot ./lk2nd.img

显示的错误信息我没有记录下来,我只记得一个关键信息:

1
Error: dtb not found

废了大约一天的功夫(?),我终于发现,阮行之大佬的手机预装的就是 Android 5.1 的 MIUI,而我的手机则是 Android 4.4,在使用 adb 查看 CPU 信息的时候就可以发现端倪,Android 4.4 系统会少几个 Features(不过这个好像跟 dtb 没啥关系……?)

总之在刷入 lk2nd 之前,先把手机刷成 Android 5.1 版本的 MIUI,然后再按部就班地刷入 lk2nd 即可。

Error 2: 显示屏大寄特寄

又过了大概两三天(?),在作业和出题的双重压迫之下,我终于想办法给它刷上了 mobian。

然而,我惊恐地发现,任凭我怎么努力地戳显示屏,手机就只能赖在锁屏界面,能做的操作只有用两只手指滑动屏幕,想点击按钮那简直是休想。不能使用触摸屏,我就不能连接网络(默认情况不支持 USB 直接连接电脑),也就不能使用 ssh 连接手机了。

折腾了大概三天左右吧,我尝试将 userdata.img 的 simg 格式转化为普通的 img 格式,在 Linux 下挂载起来,修改其中的配置文件,或者添加脚本,使得手机一开机(或者每隔一分钟)就连接 Wi-Fi,然而,我所有的努力全部木大!

最终我屈服了,在 USTC LUG 群里提了问题:
问题

大佬们给出的建议有:

  • Micro USB -> 扩展坞 -> 鼠标控制
  • qemu 启动并使用 userdata.img,查看是否安装 crontab 以及服务是否启动等

正好第二天上午,在网上看到了 otg 线相关的东西,就直接从淘宝上买了一根 otg 线。第二天就到货了,我将 otg 线连接到手机上,再插入无线鼠标的 USB 接收器,神奇的事情发生了!手机屏幕上出现了一个鼠标指针!

后面的事情,像什么连接 Wi-Fi,ssh 连接,修改配置什么的,大概就不用多说了。
不过现在,这台机子只是处于刚刚能用的阶段,我的配置之旅才刚刚开始。

Step 1: 回来吧,adb!

光靠一个 ssh 来维系我们与这个半残废手机的联系感觉还是不太靠谱,我们需要一种备用连接方案。从刷机包的 Github repository 说明可以看到,它实际上是提供了 adb 的支持的,但是在 Windows 中使用 adb devices 命令却并不能发现我们的手机,怎么辉石呢?

我们首先 ssh 连接到手机,查看 adbd 的运行情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ systemctl status adbd
● adbd.service - Android Debug Brige Daemon Service
Loaded: loaded (/lib/systemd/system/adbd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-08 14:08:36 UTC; 13min ago
Process: 315 ExecStart=/usr/sbin/dragonpi-usb (code=exited, status=0/SUCCESS)
Main PID: 332 (adbd)
Tasks: 4 (limit: 2211)
Memory: 1.0M
CPU: 57ms
CGroup: /system.slice/adbd.service
└─332 adbd

4月 08 14:08:35 mobian systemd[1]: Starting Android Debug Brige Daemon Service...
4月 08 14:08:36 mobian systemd[1]: Started Android Debug Brige Daemon Service.

运行正常,但似乎是魔改过的 adbd?我们查看一下 /usr/sbin/dragonpi-usb 的内容:

1
2
3
4
5
6
7
8
9
10
$ cat /usr/sbin/dragonpi-usb
#! /bin/sh
USB_SERIAL=$(sha256sum < /etc/machine-id | cut -d' ' -f1 | cut -c1-16)
modprobe g_ffs idVendor=0x18d1 idProduct=0x4e42 iSerialNumber=${USB_SERIAL}
mkdir -p /dev/usb-ffs/adb
mount -t functionfs adb /dev/usb-ffs/adb -o uid=2000,gid=2000
adbd &

$ which adbd
/usr/bin/adbd

看起来 dragonpi-usb 是一个 Shell Script,在 /usr/bin 下的 adbd 是正体可执行文件。
尝试运行 adbd:

1
2
3
4
5
$ adbd
install_listener('tcp:5037','*smartsocket*')
cannot bind 'tcp:5037'
$ netstat -ano | grep 5037
tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN off (0.00/0/0)

看起来使用的是 5037 端口监听,并且似乎在正常工作?那为啥我们的 adb server 没法发现这个 client 呢?

后来在网上找到了这么个帖子(论坛还是 nb):https://whycan.com/t_903.html,发现在 Windows 下这个驱动非常不稳定,换成 Linux 就能连上了。

那我为什么刚装上去的时候没识别出来呢(思考)

Step 2: 没了

后来由于这玩意充电到 100% 之后就会自动断开,不会继续充电,而且我对它没有很强的需求,调完 adb 之后这玩意就被扔到历史的角落里吃灰去了,全剧终。