首页
社区
课程
招聘
[旧帖] [求助]揭秘家用路由器0day漏洞挖掘技术第三章修复运行环境总是出错 0.00雪花
发表于: 2016-3-22 09:58 3824

[旧帖] [求助]揭秘家用路由器0day漏洞挖掘技术第三章修复运行环境总是出错 0.00雪花

2016-3-22 09:58
3824
大神们帮忙看一下,拜托了。第一次发贴,不会加图片,文档都在附件里了。照着那本书上做,出现了这样的错误,不知道大家有没有遇到过。
提取文件系统
使用binwalk将dir605L_FW_113.bin中的文件系统提取出来;
在提取的根文件系统中搜索web服务器程序boa;

获取运行错误信息

上图为运行boa的错误提示信息,使用ida分析boa,在字符串窗口中搜索“Initialize AP MIB failed!”。

可以看出再执行puts(“Initialize AP MIB failed!”)前有一个比较并跳转指令(bnez $v0,loc_418250),418250在41823C下面,如果成功跳转也许就不会报错。在0x0041821C和0x0041823C处下断点,然后以调试模式重新运行boa(sudo chroot . ./qemu-mips -g 1234 ./bin/boa)。

使用ida动态调试boa,发现apmib_init()函数执行完会返回0,而那句跳转指令的意思是如果v0里的值(函数返回值)不等于0就跳转到418250的位置,因为返回值为0,所以会继续执行puts函数,输出错误信息,然后直接返回,程序将会崩溃,web服务器启动失败。
编写劫持函数动态库
找到动态链接库里的apmib_init()函数,通过动态调试和静态反汇编对函数代码进行分析,由于函数内代码处理流程对测试没有影响,可以伪造其返回值为1,程序执行完apmib_init()函数之后跳到418250的位置,正常初始化其它参数。

编译生成动态库apmib-ld.so(mips-linux-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so)。
运行测试
将编译好的apmib-ld.so复制到DIR-605L路由器文件系统的根目录下;
把交叉编译环境下的libgcc_s.so.1动态库复制到根目录下的lib目录下;
使用LD_PRELOAD环境变量加载apmib-ld.so来劫持apmib.so中的apmib_init()函数,运行结果如下,“Initialize AP MIB failed!”错误被修复,但是程序还是崩溃了。

出现了新的错误,不能加载libc.so.1库,去交叉编译环境下寻找该库,发现它是指向另一个库的链接于是把两个库都复制到根目录的lib目录下继续执行boa,发现不能加载另一个库,用同样的方法处理了这个错误,又重新执行boa,结果如下:

继续出错,不能处理的重定位类型0x2f,到这里我就不知道该怎么办了,书上也没有出现这种情况。使用调试模式加载新的动态库运行boa,用ida进行动态调试,虽然下了断点但一运行就崩溃,说明在上次处理的那个错误执行前就出现了错误,不知道为什么。也许是把apmib_init()函数改坏了。不能顺利的打开web服务的端口,还有一个问题是程序运行错误之后IDA不能停在错误的地方,而是退出远程调试模式。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2676
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你用交叉编译工具链和boa编译用的不同以及不正确的编译选项导致的,需要整一套几乎相同的cross toolchain比较困难。为什么不直接patch原函数,直接返回1。
2016-3-23 10:46
0
雪    币: 200
活跃值: (4671)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
3
动态链接库里面的函数也可以修改吗,刚接触这个,别笑我白痴
我先回去试试啦,谢谢你
2016-3-23 12:12
0
雪    币: 200
活跃值: (4671)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
4
把机器码改了也不能直接生成可执行文件,怎么办。IDA6.6用[PatchProgram]->[Apply patches to input file]这个总是失败是为什么。心累,照着书上做怎么也都做不对。
2016-3-23 14:31
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能不能用简单一点的语言去描述?
2016-3-23 19:43
0
雪    币: 200
活跃值: (4671)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
6
      想在ubuntu下用qemu模拟运行路由器的boa,打开web服务,因为只有固件没有硬件所以运行时报错而且打不开80端口,所以找到了关键涵数改变它的返回值让程序可以跳过报错的窗口,那个函数在一个动态链接库里,就用c语言写了个函数,用mips交叉编译环境编成一个库,运行的时候加载这个库,然后就错了,也运行不到原来出错的地方了。感觉所以上面那位大神说的对,就是编译出错了。那么现在应该重新用buildroot下一个适合它的交叉编译环境还是直接改二进制,试了一下午改了之后都不会保存为新的可执行文件
2016-3-23 22:53
0
雪    币: 2676
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=蝶澈——;1421606]把机器码改了也不能直接生成可执行文件,怎么办。IDA6.6用[PatchProgram]->[Apply patches to input file]这个总是失败是为什么。心累,照着书上做怎么也都做不对。[/QUOTE]
不知道为什么你ida patch会出错。
但是,就简单的一两个字节,随便一个二进制编辑器改下原文件,也不难。
2016-3-24 10:01
0
游客
登录 | 注册 方可回帖
返回