《IOT废物学习之路》(5)--修复固件运行环境
《IOT废物学习之路》(5)–修复固件运行环境
虽然可以利用firmadyne模拟运行固件,但是并不是所有的固件都能模拟运行成功,有的固件需要依赖于硬件,qemu无法完全模拟。所以需要修复固件的运行环境,从而模拟固件运行。
固件下载地址
利用firmadyne
模拟运行一下试试
1 | sudo docker run --network host --privileged -it --rm -e USER=root -v $(pwd):$(pwd) asdqwe876/iot_analyze |
启动容器并挂载当前盘符。
将固件复制到firmadyne
。
1 | cp /home/zhuyuan/IOT/05/dir605L_FW_113.bin ./ |
设置id
1 | project_id=1 |
解压固件
1 | python3 ./sources/extractor/extractor.py -b Netgear -sql 127.0.0.1 -np -nk "firmware.bin" images |
识别cpu
1 | ./scripts/getArch.sh ./images/$project_id.tar.gz |
存储数据库
1 | ./scripts/tar2db.py -i $project_id -f ./images/$project_id.tar.gz |
创建qemu
镜像
1 | ./scripts/makeImage.sh $project_id |
设置网络接口
1 | ./scripts/inferNetwork.sh $project_id |
这一步骤上Interfaces
为空代表模拟失败。这就说明firmadyne
并不能模拟运行所有的固件,尤其是那些需要和硬件进行交互的固件。
从另一个方面想,模拟固件运行的实质就是把固件的web
程序运行起来,模拟失败的原因就是web
程序没有被正确运行起来。所以需要针对web
程序报错的原因以及如何修复运行环境。
首先利用binwalk
提取固件的文件系统。
1 | sudo docker run -it --rm \ |
使用命令:
1 | find ./ -name boa |
定位该固件的web
程序。Boa
程序是轻量级的web
服务器程序,常见于嵌入式系统中。常见路径为bin/boa
。
同时在etc/boa
下发现boa
的密码配置文件,可以直接获取到boa
加密后的密码。
直接使用命令模拟运行程序。
使用ida
对boa
程序进行逆向分析。
发现会根据apmib_init
函数返回的值来判断是否跳转,如果相等则跳转,不相等则继续执行,输出报错。
apmib_init
函数是从flash
中读取mib
值到RAM
中,模拟环境中没有flash
硬件,所以会读取失败。
可以通过修改把bnez
为beqz
,这样即使读取失败,也能正确执行读取成功之后的内容。
但是这个程序利用ida
自带的patch
不会成功。就用编辑器修改字节码也可以。
将bnez(0x14)
命令改成beqz(0x10)
。
修改之后运行
经过调试,发现是apmib_get
函数导致的错误。
两个Create chklist file error!
不影响。
重新伪造apmib_init
和apmib_get
劫持代码。返回正确值。
1 |
|
编译为so
文件。
1 | mips-linux-gnu-gcc -Wall fPIC -shared apmib.c -o apmib-ld.so |
利用LD_PRELOAD
参数指定劫持so
,这样当boa
执行到apmib_init
和apmib_get
时,就调用到apmib-ld.so
里的函数,从而顺利运行。
但是访问时,程序又崩溃了,自动跳转到/Basic/Wizard_Easy_LangSelect.asp
查看该文件ASP
代码,通过文件名猜出是选择页面语言,尝试从硬件设备读取语言。
1 | cat Basic/Wizard_Easy_LangSelect.asp |
修该first.asp
,不判断系统语言,直接进入。
修改后
成功进入web页面