DIR-605L路由器boa修复运行

直接运行./bin/boa程序,会提示一个错误

idapro载入boa程序,strings查看此字符串,定位到程序调用处

先调用apmib_init函数,然后puts此段字符串

此函数定义在lib目录下的apmib.so中

载入apmib.so文件,找到apmib_init函数,根据CFG图可知此函数非常复杂

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

apmib.c修改代码如下

#include <stdio.h>
#include <stdlib.h>
int apmib_init(void)
{
    return 1;
}

在buildroot路径下选择用mips-linux-gcc进行编译

./mips-linux-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so

将编译后的.so文件复制到squ-root目录下,之后执行

chroot ./ ./qemu-mips -E LD_PRELOAD=”./apmib-ld.so” ./bin/boa

可以看到之前错误没了,变为存在create chklist file error错误

使用-g port_number命令开启gdb调试

 chroot ./ ./qemu-mips -E LD_PRELOAD=”./apmib-ld.so” -g 1235 ./bin/boa

直接idapro载入运行,发现会直接运行结束并报错,在bnez跳转的地方设置断点

再次调试,断下后发现此时V0值为1,程序执行右侧绿线,就不会报之前Initialize AP MIB failed错误了

F8单步执行,当程序执行到apmib_get函数调用时,程序崩溃。

所以apmib_get这个函数也需要进行劫持。

apmib_get()函数位于apmib.so中,其CFG图如下

程序比较复杂,参考书中大佬的分析和代码

最终apmib.c源码(与书中相比没有fork()函数)

#include<stdio.h>
#include<stdlib.h>

#define MIB_IP_ADDR 170
#define MIB_HW_VER 0x250
#define MIB_CAPTCHA 0x2C1

int apmib_init(void)
{
	return 1;
}
void apmib_get(int code, int *value)
{
	switch(code)
	{
	case MIB_HW_VER:
		*value = 0xF1;
		break;

	case MIB_IP_ADDR:
		*value = 0x7F000001;
		break;

	case MIB_CAPTCHA:
		*value = 1;
		break;
	}
}

mips-linux-gcc重新编译一下,然后运行,可以看到boa已经可以成功执行

刚开始测试的时候,我的linux默认是开启apache2服务的,80端口被占用

然后开启boa服务,可以看到分配的端口是40215

访问此端口的时候,从first.asp跳转到 Basic/Wizard_Easy_LangSelect.asp页面

并且依然会出现访问错误,Hmmmm…

查看first.asp页面源码,判断LangCode的值来选择跳转的页面,直接改成Welcome.asp页面

<html>
<head>
</head>
<% getLangInfo("LangPathWizard");%>
<script>
function init()
{
	var ecflag = <% getIndexInfo("enableecflag") %>;
	if(ecflag == 0)
	{
		if((LangCode == "SC")||(LangCode == "TW"))
		{
			self.location.href="Basic/Wizard_Easy_Welcome.asp";
		}
		else
		{
			self.location.href="Basic/Wizard_Easy_LangSelect.asp";
		}
	}
	else
	{
		self.location.href="index.asp";
	}
}
</script>
<body onLoad="init();">
</html>

测试的时候端口经常换,可以说很不爽了,干脆将apache2服务停掉

service apache2 stop

然后再次查看端口和服务

此时直接访问Wizard_Easy_Welcome.asp页面,会自动跳转到logout.asp页面,要求重新登录

测试时发现,只要访问Wizard_Easy_LangSelect.asp页面,程序就会报错,所以我怀疑这个页面代码存在问题或者有逻辑缺陷等。

选择返回登录页面,来到index.asp,可以重新登录了

也可以直接访问ip地址下的index.asp进行登录

您可能还喜欢...