路由器运行环境修复
简介
有的固件下载完之后会出现运行环境错误的情况,所以需要手动修复,固件下载:ftp://ftp2.dlink.com/PRODUCTS/DIR-605L/REVA/DIR-605L_FIRMWARE_1.13.ZIP
恢复环境
用binwalk提取出固件,然后又提取出根文件系统中找到目录Web服务器程序boa:/bin/boa,然后先运行下,发现崩溃了。
ida加载boa,查找字符串找到打印”Initialize AP MIB failed!“的位置,可以看到是apmib_init这个函数返回值为0的时候跳到了打印函数。
LOAD:00418214 la $t9, apmib_init
LOAD:00418218 nop
LOAD:0041821C jalr $t9 ; apmib_init
LOAD:00418220 nop
LOAD:00418224 lw $gp, 0x38+var_28($sp)
LOAD:00418228 bnez $v0, loc_418250
LOAD:0041822C nop
LOAD:00418230 la $a0, (aSsiDnsResolveA+0x10) # "asp"
LOAD:00418234 la $t9, puts
LOAD:00418238 nop
LOAD:0041823C jalr $t9 ; puts
LOAD:00418240 addiu $a0, (aInitializeApMi - 0x490000) # "Initialize AP MIB failed!"
LOAD:00418244 lw $gp, 0x38+var_28($sp)
LOAD:00418248 b loc_4184B4
LOAD:0041824C nop
想具体看看这个函数内部结构发现在ida里面并没有找到,这证明了这个函数不是boa文件里面调用的,而是链接库里的文件。
根据书本的介绍这个函数来自apmib.so动态链接库,用ida加载这个库,看了看这个缩略图,这个函数真的很复杂。
但可以看到之前ida加载的boa文件中,发现这个函数的交叉引用整个我呢就只在这个地方有用到,所以对这个函数的实际功能可以不怎么了解,对后面的运行也没有影响。所以可以写一个伪造函数来替代它,让它的返回值为1就不会出现报错了。
代码:
#include <stdio.h>
#include <stdlib.h>
int apmib_init(void)
{
return 1;
}
然后用这条命令编译成共享库,要注意这里一定要用mips大端交叉编译模式编译,不能用mipsel,因为boa文件就是大端模式。我这里弄了比较长的时间,因为之前安装交叉编译环境是装的mipsel的,但看资料说可以用mipsel进行大端的编译,但没找到参数是什么,搞了半天只能重新再装一个mips大端的交叉编译环境。编译完之后放在根目录下面
./mips-linux-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so
chroot . ./qemu-mips -E LD_PRELOAD="/apmib-ld.so" ./bin/boa
重新编译之后发现还有崩溃,最开始还是和上面的方法一样找输出的字符串是什么错误,但发现没有什么用,照着书上动态调试发现在apmib_get()处崩溃,并且在apmib_get()之前就输出了这段字符串。
找到apmib_get()函数,然后也劫持它。
void apmib_get(int code,int *value)
{
switch(code)
{
case 0x250:
*value=0xf1;
break;
case 170:
*value=0xf1;
break;
case 0x2c1:
*value=0xf1;
break;
}
}
重新编译
./mips-linux-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so
可以访问了
参考链接
《揭秘家用路由器0day漏洞分析技术》