本次实验中我们首先尝试使用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漏洞挖掘技术》
1111

被折叠的 条评论
为什么被折叠?



