固件和exp都已经放在这个地方了:https://gitee.com/p1piyang/backward-analysis/tree/master/
建议先通一遍文章再动手复现,复现之前一定要保存虚拟机快照,防止出现各种奇奇怪怪的问题
解压固件
直接使用binwalk -Me HG532eV100R001C02B015_upgrade_main.bin
命令来直接解压固件文件
解压完成后,在固件同文件夹下可以看到解压出来的文件夹
文件夹中的squashfs-root
就是我们需要的文件系统了,如果squashfs-root中没有下图的各种文件系统,就是你的binwalk有不完整,去看iot固件分析环境搭建
配置网络
我们要让qemu虚拟机和我们的ubuntu互通。
安装网络配置工具
1 | apt - get install bridge - utils uml - utilities
|
修改ubuntu网络配置文件 /etc/network/interfaces/
sudo vim 你一定会把!
内容改成如下,图下提供了复制粘贴的代码(贴心人)
1 2 3 4 5 6 7 8 9 10 11 12 13 | auto lo
iface lo inet loopback
auto ens33
iface ens33 inet manual
up ifconfig ens33 0.0 . 0.0 up
auto br0
iface br0 inet dhcp
bridge_ports ens33
bridge_maxwait 0
|
创建或修改qemu的网络接口启动文件脚本/etc/qemu-ifup
如果没有这个文件直接创建就可以了,如果有的话将里边内容清空,然后写入下面脚本
1 2 3 4 5 6 7 8 9 10 11 12 | echo "Executing /etc/qemu-ifup"
echo "Bringing $1 for bridge mode..."
sudo / sbin / ifconfig $ 1 0.0 . 0.0 promisc up
echo "Adding $1 to br0..."
sudo / sbin / brctl addif br0 $ 1
sleep 3
|
然后依次执行如下操作
1 2 3 4 5 6 7 | sudo chmod a + x / etc / qemu - ifup
sudo / etc / init.d / networking restart
sudo ifdown eth0
sudo ifup br0
|
如图所示,当前网卡为br0
配置完之后,如果下面qemu虚拟机配置之后,仍然无法获取ip,重启ubuntu
配置qemu虚拟机
先去下载debian-mips-qemu镜像文件,每次固件分析要注意对应大小端序的镜像文件(还是有设备的好)
下载地址:https://people.debian.org/~aurel32/qemu/mips/
我们需要红框里的两个文件,然后在文件所在地方启动qemu
这里特别说明,最后一个参数-nographic
带上是在终端中直接运行,不会弹出窗口运行,建议一定不要开,我这里开了之后这个窗口的返回快捷键和vmware的一模一样,就导致我只能在mac和qemu中间用,我回不去我的ubuntu了。
1 | sudo qemu - system - mips - M malta - kernel vmlinux - 2.6 . 32 - 5 - 4kc - malta - hda debian_squeeze_mips_standard.qcow2 - append "root=/dev/sda1 console=tty0" - net nic,macaddr = 00 : 16 : 3e : 00 : 00 : 01 - net tap - nographic
|
如果你的多次运行qemu,可能会出现如下错误
<img src="https://i.loli.net/2021/09/02/Pa1zTB9lYoLteEg.png" alt="image-20210902143652004" style="zoom:50%;" />
这是服务没有退出导致的
ps查出当前qemu进程号,kill掉就好了
ps -e | grep 'qemu'
<img src="https://i.loli.net/2021/09/02/aRwVdGWEtqnrKPy.png" alt="image-20210902143845743" style="zoom:50%;" />
sudo kill 3307
即可
启动如上图,账号密码都是root
启动后尝试,ping baidu.com 和 ubuntu
如果不通
查看网卡第一个是什么,一般都会是eth1
然后修改/etc/network/interfaces
,注意这里是在qemu虚拟机中修改
1 | nano / etc / network / interfaces
|
第一次配置红框中一般是eth0,将红框中的内容修改为你的网卡名字
保存后使用下面指令重启eth1
再次尝试,如果还不行或者ifconfig发现eth1没有分配地址,重启ubuntu或者找原因,不行就恢复快照
如果成了的话是可以用ssh远程连接qemu虚拟机的
建议在ubuntu中使用ssh连接,比较方便
接下来将我们解压出来的文件系统拷贝到qemu
1 | scp - r . / squashfs - root root@虚拟机ip: / root /
|
复现
通过checkpoint报告中能看到关键字为ctrl
和Deviceupgrade
,端口号为37215
使用grep来查找
两个都指向upnp这个文件,端口号指向mic这个文件
直接运行会出问题,我们切换根目录到拷贝进来的系统文件中
1 | chroot / root / squashfs - root / bin / sh
|
然后先后运行upnp和mic
到这个地方mic已经运行成功了,放着不用管他了
使用lsof -i:37215可以查看端口是否运行
用下面命令来查看是否启动成功
1 | nc - vv 192.168 . 150.9 37215
|
成功了就可以跑exp了
与checkpoint不同的是,我把溢出的命令修改了(红框处,这里就是灵活使用了),蓝框处修改为qemu的ip
执行exp后 在mic界面可以看到
ls被成功执行了。
原因分析
Ida7.5可以反编译qemu
通过exp能发现,命令行放在了NewStatusURL标签下,在ida中通过字符串查找
49c的位置使用快捷间p可以创建函数,来反编译
snprintf函数将可变个参数按照format格式化成字符串,然后将其复制到str中,即把v5与前面字符串拼接放到v6中,并且system执行了v6
根据exp的执行效果来推测,ATP_XML_GetChildNodeByName这个函数读取NewStatusURL标签的内容放到了v5。
伪代码不可信,尽量还是通过汇编代码分析
倒推能发现,system的参数为0x42C+var_414($sp)
0x42C+var_414($sp)
为snprintf 的第一个参数,0x42C+var_40C($sp)
为snprintf的第四个参数
即 0x42C+var_40C($sp)
的内容通过函数放到了0x42C+var_414($sp)
而0x42C+var_40C($sp)
为ATP_XML_GetChildNodeByName的一个参数,这里应该是读取后放到了0x42C+var_40C($sp)
,没有办法ATP_XML_GetChildNodeByName做具体分析,但通过网上一些师傅的文章,应该大差不差了
然后了解原理我们就可以通过闭合来实现命令运行了。
学习文章,希望师傅们多多指正
[培训]《安卓高级研修班(网课)》月薪三万计划
最后于 2021-9-3 10:52
被头顶flag编辑
,原因: 内容有错