路由器固件调试方案
0x01前言
本文主要介绍在研究路由器固件安全时常用的两种调试方法,分别是IDA远程调试和gdb远程调试。这里需要注意,由于路由器基本都是mips架构,所以下文是以mips为例展开的,不过如果碰到了arm的,也是同理的。
0x02
IDA Pro远程调试
使用qemu-system模式运行的脚本如下:
这里涉及的两个文件分别是内核文件和磁盘镜像文件
这里注意,我们这里涉及到的固件是大端格式的,如下所示:
所以是用*mips,而不是*mipsel
为了后面的调试,我们还需要准备好gdbserver,可以自己编译,不过我建议使用网上已经静态编译好的gdbserver。这里给出rapid7放出来的:
https://github.com/rapid7/embedded-tools
这次用到的是大端的,所以使用gdbserver.mipe即可
在运行该脚本之前,除了准备好这两个文件之外,还要执行下图的命令
将其复制到当前目录下
此时路径下的文件包括:
这样就可以启动了
启动成功后如图所示
输入root/root即可
查看ip
将之前提取出的文件系统通过scp上传到机器上
再将gdbserver上传
回到debian看到上传成功
然后将gdbserver复制到squashfs-root目录下
接下来挂载根文件系统
这样,文件系统在mips系统中就成功挂载并运行了
接下来通过gdbserver进行远程调试:
命令中的ip就是debian的ip,端口号自行设置,后面跟着的是要调试的程序
然后在win中打开ida,载入本地的cgibin,在main下断点
接着debugger->select a debugger
选择remote gdb debugger
点击ok即可
debugger->process options
上面填入在debian中的路径,下面是ip以及对应的端口,点击ok即可
debugger->attach to process
选择第一个,点击ok后,即可进行调试
点击左上角的箭头后,就会自动运行,命中下的断点
说明调试环境已经搭建好了。
0x03
GDB远程调试
打开两个终端:
一个终端使用qemu-user模式运行stack_bof_01
与直接运行不同,这里通过-g指定了端口
接下来在另一个终端通过gdb调试
-multiarch是为了支持其他架构用的,比如我们这里的mips架构
接下来首先设置架构为mips
然后设置ip和端口
通过pwndbg的扩展,我们就可以很方便的进行调试了
0x04
看完这篇文章,其实大家都知道我的重点放在了ida动态调试上,个人觉得这是最可靠的调试方案。不过这期间涉及到的功能实现都是有很多方案可以备选的:比如在上传文件系统,gdbserver到debian时我用的scp,当然还可以用其他的,ftp也可以,用python也行(python -m SimpleHTTPServer)
如果是新手看到这篇文章的话,一定要注意,文中我虽然是qemu-system模式和IDA远程调试结合进行分析,qemu-user模式和gdb-multiarch结合进行分析。但是实际上,是可以自由组合的。另外,radare2也是可以用于mips的调试的,但是就我个人经验而言没有必要,所以就不再介绍。
最后给出一篇扩展的文章:https://www.ringzerolabs.com/2018/03/the-wonderful-world-of-mips.html
里面介绍了qemu的两种模式仿真,与radare2本地/远程调试,gdb远程/本地调试,ida远程调试等一共九种组合方案的实现。学有余力的话可以去看看。