前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一次qemu动态调试路由程序的记录

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

作者头像
用户1423082
发布于 2024-12-31 10:28:34
发布于 2024-12-31 10:28:34
13600
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

实践

下载固件ftp://54.187.190.227/PRODUCTS/DIR-605L/REVA/DIR-605L_FIRMWARE_1.13.ZIP,

binwalk解开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
binwalk -e ./dir605L_FW_113.bin

讲qemu-mips复制到固件根目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp $(which qemu-mips) ./

尝试直接执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo chroot . ./qemu-mips ./bin/boa
chroot: failed to run command ‘./qemu-mips’: No such file or directory

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

复制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo chroot ./ ./qemu-mips ./bin/boa
Initialize AP MIB failed!
qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Segmentation fault

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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在那

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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,当然要使用多架构的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install gdb-multiarch

最好装个gef

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/hugsy/gef

gdb打开

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdb-multiarch ./boa

gdb远程附加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gef➤  target remote 127.0.0.1:1234

那就可以愉快地调试了

那我们怎么劫持这个调用呢,那我们就,搜索一下,应该是下面的so文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ find ./ -name "apmib*"
./lib/apmib.so

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

int apmib_init(){
    return 1;
}

编译前,装一下啊gcc-mips-linux-gnu

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install gcc-mips-linux-gnu

编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ mips-linux-gnu-gcc -Wall -fPIC -shared apmib.c -o apmib-ld.so

我们启动的时候可以用-E设置环境变量(LD_PRELOAD就是优先加载我们的so文件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo chroot ./ ./qemu-mips -E LD_PRELOAD="./apmib-ld.so" ./bin/boa
./bin/boa: can't load library 'libc.so.6'

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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漏洞挖掘技术》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实践
  • reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档