一次qemu动态调试路由程序的记录

实践

下载固件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
2
sudo chroot . ./qemu-mips ./bin/boa
chroot: failed to run command ‘./qemu-mips’: No such file or directory

后来发现需要将依赖库复制到对应目录

1
2
3
4
5
6
7
8
9
10
11
12
giant@ubuntu:~$ ldd /usr/bin/qemu-mips
linux-vdso.so.1 => (0x00007fffc016e000)
libgmodule-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f252f59a000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f252f286000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f252f07e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f252ed28000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f252eb11000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f252e8f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f252e512000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f252e30e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f252e09c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2531c02000)

复制

1
2
3
4
5
6
7
8
9
10
cp /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0  ./usr/lib/
cp /lib/x86_64-linux-gnu/libglib-2.0.so.0 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/librt.so.1 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libm.so.6 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpthread.so.0 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libc.so.6 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libdl.so.2 ./lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libpcre.so.3 ./lib/x86_64-linux-gnu
cp /lib64/ld-linux-x86-64.so.2 ./lib64

ok,完美,接下来就是处理路由器程序的问题了(路由器的web二进制程序是boa)

1
2
3
4
sudo chroot ./ ./qemu-mips ./bin/boa
Initialize AP MIB failed!
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

32位程序,那就用32位ida远程调试

1
2
$ file ./bin/boa
./bin/boa: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, corrupted section header size

加上-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
2
$ find ./ -name "apmib*"
./lib/apmib.so

那我们编写一个动态库劫持这个init函数得了,直接return1

1
2
3
4
5
6
#include <stdio.h>
#include <stdlib.h>

int apmib_init(){
return 1;
}

编译前,装一下啊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
2
sudo chroot ./ ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" ./bin/boa
./bin/boa: can't load library 'libc.so.6'

那就讲lib目录的文件复制一份,又来一个错误

1
2
3
4
5
6
7
8
9
giant@ubuntu:~/learn/ch3/_dir605L_FW_113.bin.extracted/squashfs-root-0/lib$ file libc.so.0 
libc.so.0: ELF 32-bit MSB shared object, MIPS, MIPS-I version 1 (SYSV), dynamically linked, corrupted section header size
giant@ubuntu:~/learn/ch3/_dir605L_FW_113.bin.extracted/squashfs-root-0/lib$ cp libc.so.0 libc.so.6
giant@ubuntu:~/learn/ch3/_dir605L_FW_113.bin.extracted/squashfs-root-0/lib$ cd ..
giant@ubuntu:~/learn/ch3/_dir605L_FW_113.bin.extracted/squashfs-root-0$ sudo chroot ./ ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" ./bin/boa
Create chklist file error!
Create chklist file error!
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

这个报错是两个函数里头

但一时发现不了是哪里出错,那就从之前apmib_init开始调试

但是不知道为何v0已经为1了,我单步还是不跳,无语

直接用作者的.c去编译就可以启动起来,但是用web访问还是会崩,好了其实这个过程也学到了不少

reference

《揭秘家用路由器0day漏洞挖掘技术》

自愿打赏专区