小米路由器固件提取仿真

发布时间:2026/7/18 14:22:11
小米路由器固件提取仿真 文章目录小米路由器提取 仿真提取文件系统仿真内核与最小文件系统选择模拟平台脚本编写最终效果网络配置如何传输 文件系统?模拟运行 uhttpd 启动启动流程探索 uhttpd 启动小米路由器提取 仿真鉴于在 6 月份的时候因为那小米路由器的flash导致摧毁了一块芯片。上次在实验室的时候依旧没有敢把那块芯片给使用吹分机给吹下来。但是我的爱玩的好师兄们。在网上淘到了一块不需要吹下来使用夹子夹的编程器由于没以为能模拟成功所以没有拍照片和另一位同学将固件给读了出来于是借着这次机会试一试学了好几个月的qemu仿真的水平到底怎么样并为停滞不前的老项目renode仿真找找灵感和思路。固件提取的部分我们将会跳过后续有机会拍到照片的时候将再重新补充大致的思路文件提取文件系统qemu-system-* 仿真平台的搭建最小文件系统的选择 内核的选择 这里有大坑模拟平台脚本编写细节处理 最终结果展示网络配置 ping 通宿主机查看启动项成功启动uhttpd 为什么要去启动uhttpd提取文件系统这个部分应该是我们做的最轻松的一个部分了将提取好的固件使用scp传到我们的虚拟机中并使用binwalk -e xiaomi.bin将对应的固件解压即可对应的效果如下最后使用file bin/busybox查看当前的设备使用的平台类型这个平台是mipsel仿真内核与最小文件系统选择这个是花费了最长时间的地方并且踩了很多的坑对应的官方网站如下官方网站最初的选择kernel vmlinux.elf 最小文件系统rootfs.cpio.gz (❌ 有坑)后面的选择kernel: vmlinux.elf最小文件系统rootfs.img因为知道最小文件系统的重要性所以这次选择去官网上找对应的官方版本深度理解各个版本之间的不同区别有些坑是得自己亲自跳进去的其实就是傻找的借口在使用最初的选择的时候rootfs.cpio.gz 使用的是24.10.2的版本。就是 24年10月份的版本这个版本在进行模拟仿真的时候qemu不会去解压我们的最小文件系统rootfs.cpio.gz。为什么呢新的kernel不会去关注因为新 的kernel 处理定位rootfs.cpio.gz的位置和老的方法不一样了rd_start和rd_size他定位的方式不是通过偏移值和大小来定位的所以当使用这个文件的时候内核定位不到他。就会一直循环的寻找并且报错但是去了官网上看了一下只有24年之后的mips才出了小端序的版本以往的版本只有bl于是这两点加在一起我不得不放弃了最初的选择。所以最终我们选择了后面的选择。模拟平台脚本编写这里最主要的参数就是:-append相关的参数。细节很多1#/usr/bin/bash23echo------------------ Emulator ---------------------4echo-- --5echo-- Progress Start --6echo-- --7echo-------------------------------------------------8echoOpenwrt mirrors webSite: 9echo https://mirror.sjtu.edu.cn/openwrt/releases/24.10.2/10echoauthor: Jiafeng111213qemu-system-mipsel\14-Mmalta\15-m512\16-kernel./vmlinux.elf\17-hda./rootfs.img\18-appendroot/dev/sda rootfstypesquashfs rootwait ro consolettyS0,115200\19-nographic\20-netdevtap,idnet0,ifnametap0,scriptno,downscriptno\21-devicepcnet,netdevnet02223# -append params is very important. and then rootfstypesquashfs秀一下我的vim配色哈哈哈也是捣鼓了好一阵子最终效果网络配置这个也是一个坑我们首先宿主加上需要配置简单的 tap 口来保证和客户机之间的通信宿主机上的配置# 宿主机上的配置:sudoiptuntapaddmode tap tap0 user$USER2/dev/nullsudoipaddr flush dev tap0sudoipaddradd192.168.10.1/24 dev tap0sudoiplinksettap0 up客户机上的配置一定要将 eth0 网卡从桥接中拿出来这个问题在以往的配置中都没有遇见过# 客户机上的网卡配置iplinksetbr-lan down2/dev/nulliplinkseteth0 nomaster2/dev/nullipaddr flush dev eth0ipaddradd192.168.10.9/24 dev eth0iplinkseteth0 up /etc/init.d/firewall stopping192.168.10.1【Tips】Linux 上使用 tcpdump 的网络抓包技巧sudo tcpdump -i interface-name -n arp or icmp通过这样的方式来看当前的网络通信持续到了哪一步如何传输 文件系统?这个是一个被忽略的问题最小的文件系统上没有提供相关的关于 ssh 的服务的指令所以宿主机上不可能使用 scp 指令将文件传到客户机上这该怎么办呢方案将文件系统先打包python 运行http服务最小文件系统使用 wget 来下载对应的原理就如上述所说的那样 下面开始实际操作# 打包操作:tar-czf./squashfs-root.tar.gz squashfs-root# Python 3python-mhttp.server8000# wget 下来wgethttp://-ip地址-:8000/path/squashfs-root.tar.gz# 解压:tar-xzvfsquashfs-root.tar.gz# 删除rmsquashfs-root.tar.gz模拟运行 uhttpd 启动模拟运行部分就是相当简单了使用三段式入手cdsquashfs-rootmount--bind/proc procmount--bind/dev devchroot./bin/sh模拟运行后的结果如下图所示等我们进入后发现哎呀我们的/sbin/init启动不起来啊 好的这个就是下面的故事了启动流程探索 uhttpd 启动Linux 的服务脚本一般存放在 /etc/init.d/*而初始化的服务放在/etc/rc.d/*所以思路很明确去看看/etc/re.d/这个目录下面都有些什么【注】S开头的就是 启动的时候会进行的K 开头的就是关机的时候需要注意的S11sysctl——S11timezone——S11ubus需要修复一下文件目录—— netconfig(可以不启动 内部已经实现了互通) ——S50uhttpdUHTTP启动/usr/sbin/uhttpd-f-h/www-p0.0.0.0:8080再配一次网络因为启动netconfig服务之前的服务失效了测试网络的连通性最终可以发现通过虚拟机上的浏览器可以访问到页面了后面别的相关的问题漏洞慢慢再找把…