dir605环境修复实验

本次实验中我们首先尝试使用qemu模拟运行路由器程序,会发现报错,此时将学习一种通用的解决思路,通过IDA分析报错的地方,然后根据实际情况写个c程序,通过劫持函数调用来修复相关问题。

使用qemu等工具模拟自然很方便,但是由于路由器相关硬件模块的缺失有时候可能会导致应用程序启动失败的情况。如本次实验将分析的dir-605l中的boa程序。本次实验着重介绍遇到此类问题时的一种通用解决思路,通过ida分析函数执行流程,并尝试劫持函数调用来修复相关问题,使得qemu能进行正常的模拟。
接下来进入实验。
给了一个压缩文件
在这里插入图片描述

解压后得到。Bin文件
在这里插入图片描述

binwalk提取
在这里插入图片描述

进入路由器文件系统根目录,将用到的组件拷贝过来
sudo chroot . ./qemu-mips-static ./bin/boa
在这里插入图片描述

然后尝试执行boa
在这里插入图片描述

报错了,接下来使用ida进行分析

在这里插入图片描述

初始化之后是这样子的
在这里插入图片描述

在strings窗户搜索报错时关键字
在这里插入图片描述

双击
在这里插入图片描述

查看交叉引用
在这里插入图片描述

如下所示
在这里插入图片描述

可以看到是puts打印出报错的字符串
结合右下角的graph view看看是怎么执行到这儿的
在这里插入图片描述

可以看到,这之前是调用了apmib_init
去搜一下
在这里插入图片描述

并没有其原型定义,在ida import表中找到了apmib_init导入函数
在这里插入图片描述

去库文件夹找一下,找到了apmib.so
在这里插入图片描述

对其分析
在这里插入图片描述

找到apmib_init
在这里插入图片描述

逻辑比较复杂,回到之前那幅图
在这里插入图片描述

如上所示,根据跳转语句,当apmib_init返回0时,会出现上述报错,所以可以伪造此函数让其返回1,改变程序执行流程。

我们写一个简单的apmib.c

在这里插入图片描述

编译
在这里插入图片描述

因为这是使用共享库编译的,所以需要把交叉编译环境下的libgcc_s.so.1动态库复制到路由器文件系统根目录的lib目录下
在这里插入图片描述

使用LD_PRELOAD环境变量加载apmib-ld.so,劫持ampb.so中的apmib_init()函数
尝试执行
在这里插入图片描述

还是报错,不过报错的内容和之前不一样
进行动态调试看看
debugger->select debugger
在这里插入图片描述

选择remote gdb debugger
在这里插入图片描述

接下来在另一个终端使用-g port 开启gdb调试
在这里插入图片描述

回到ida
在这里插入图片描述

Hostname设置127.0.0.1,端口1234
在这里插入图片描述

然后debugger->attach process
在这里插入图片描述

点击ok
在这里插入图片描述

初始界面如上所示,点击左上角的三角形直接运行
在这里插入图片描述

发现报错了,我们在bnez跳转的地方设置断点
在这里插入图片描述

再次调试,执行执行后停在了我们断点的地方
在这里插入图片描述

如上所示停在了bnez处,此时v0值为1
继续f8单步执行
在这里插入图片描述

如上所示,执行到apmib_get时报错了
那么我们接下来执行apmib_get函数
将apmib.so载入ida,定位到apmib_get,从图中可以看到程序比较复杂,自己写的话大概分三个case
在这里插入图片描述

直接写劫持函数,和之前的函数写在一起,代码如下
在这里插入图片描述

完整代码在apmib.c
再次编译
在这里插入图片描述

然后执行
在这里插入图片描述

可以看到已经成功运行了

参考:
1.《揭秘家用路由器0day漏洞挖掘技术》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值