实践
下载固件ftp://54.187.190.227/PRODUCTS/DIR-605L/REVA/DIR-605L_FIRMWARE_1.13.ZIP,
binwalk解开
1 | binwalk -e ./dir605L_FW_113.bin |
讲qemu-mips复制到固件根目录
1 | cp $(which qemu-mips) ./ |
尝试直接执行
1 | sudo chroot . ./qemu-mips ./bin/boa |
后来发现需要将依赖库复制到对应目录
1 | giant@ubuntu:~$ ldd /usr/bin/qemu-mips |
复制
1 | cp /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 ./usr/lib/ |
ok,完美,接下来就是处理路由器程序的问题了(路由器的web二进制程序是boa)
1 | sudo chroot ./ ./qemu-mips ./bin/boa |
32位程序,那就用32位ida远程调试
1 | $ file ./bin/boa |
加上-g参数qemu会帮你启动一个gdbserver在那
1 | $ sudo chroot ./ ./qemu-mips -g 1234 ./bin/boa |
ida打开程序后远程附加调试,搜索字符串并在上一处跳转处下断点
可以看到是apmib_init函数返回0导致输出Initialize AP MIB failed!这个错误
查了下:http://jyhshin.pixnet.net/blog/post/47162002-realtek-apmib-library
apmib_init(),是從 flash 讀出 mib 值寫入 RAM,这个跟我们的web程序应该影响
或者使用gdb,当然要使用多架构的
1 | sudo apt install gdb-multiarch |
最好装个gef
1 | https://github.com/hugsy/gef |
gdb打开
1 | gdb-multiarch ./boa |
gdb远程附加
1 | gef➤ target remote 127.0.0.1:1234 |
那就可以愉快地调试了
那我们怎么劫持这个调用呢,那我们就,搜索一下,应该是下面的so文件
1 | $ find ./ -name "apmib*" |
那我们编写一个动态库劫持这个init函数得了,直接return1
1 | #include <stdio.h> |
编译前,装一下啊gcc-mips-linux-gnu
1 | sudo apt install gcc-mips-linux-gnu |
编译
1 | $ mips-linux-gnu-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so |
我们启动的时候可以用-E设置环境变量(LD_PRELOAD就是优先加载我们的so文件)
1 | sudo chroot ./ ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" ./bin/boa |
那就讲lib目录的文件复制一份,又来一个错误
1 | giant@ubuntu:~/learn/ch3/_dir605L_FW_113.bin.extracted/squashfs-root-0/lib$ file libc.so.0 |
这个报错是两个函数里头
但一时发现不了是哪里出错,那就从之前apmib_init开始调试
但是不知道为何v0已经为1了,我单步还是不跳,无语
直接用作者的.c去编译就可以启动起来,但是用web访问还是会崩,好了其实这个过程也学到了不少
reference
《揭秘家用路由器0day漏洞挖掘技术》