八、IDA动态调试MIPS-Linux程序

在使用IDA对MIPS-Linux程序做动态分析的时候,按照常规的逻辑,我们应该假设MIPS-Linux程序能够以一种等待调试的状态运行着,然后我们就可以使用IDA远程附加调试的方式attach到这个MIPS-Linux进程上,然后通过断点或单步的方式对进程进行动态调试。所以,“如何让路由器中的MIPS-Linux程序能够以一种等待调试的状态运行着”应该是首要解决的问题。然而实际情况却没那么乐观,因为在目前市面上的大部分路由器中都不存在调试服务器程序(例如:gdbserver),所以我们要么将外部编译好的gdbserver拷贝到路由器中执行,要么就应该借助模拟器的方式将要调试的程序以等待调试的状态模拟运行。本节内容主要总结了使用模拟器+IDA的方式对MIPS-Linux架构的应用程序进行动态调试的方法。

在《QEMU环境搭建-上》这篇博客中,我们介绍了如何使用qemu在x64的Ubuntu虚拟机中运行MIPS-Linux架构的应用程序,我们这里稍加回顾一下,我们通过使用binwalk命令对D-Link dir605L固件进行解包,得到了固件中包含的各种运行在路由器中的应用程序。最终我们又使用了qemu-mips-static命令成功运行了其中的ls命令。下面我们就以这个ls命令为基础,介绍如何通过IDA对ls命令进行动态调试的:

固件解包命令:

$ binwalk  -e dir605L_FW_113.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
11280         0x2C10          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 2129920 bytes
563234        0x89822         Squashfs filesystem, big endian, version 2.0, size: 64160 bytes, 7 inodes, blocksize: 65536 bytes, created: 2012-05-25 04:03:47
628788        0x99834         Squashfs filesystem, big endian, version 2.0, size: 2301312 bytes, 495 inodes, blocksize: 65536 bytes, created: 2012-05-25 04:04:00

使用cd命令切换到固件文件系统所在的目录:

$ cd ./_dir605L_FW_113.bin.extracted/squashfs-root-0/

使用find命令查找固件文件系统中包含的ls命令:

$ find ./ -name "ls"
./bin/ls

使用Ubuntu系统的ls命令查看路由器固件中的ls程序文件属性:

$ ls -l ./bin/ls
lrwxrwxrwx ...... ./bin/ls -> busybox

我们发现ls命令实际上是busybox命令的一个软链接。

所以,我们应该将busybox命令作为动态调试的对象,以此来分析路由器固件中的ls命令。但使用IDA加载程序的时候我们仍然选择打开bin/ls文件即可,IDA会自动识别到ls是指向busybox文件的软链接,并对busybox文件进行加载:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择了ls文件所在的位置后,基本上一路保持默认就能够顺利的加载ls程序:
在这里插入图片描述
然后在IDA左侧的“Function window”边栏中输入“ls_main”函数,双击“ls_main”函数后,在IDA右侧就能够显示该函数的反汇编代码了:
在这里插入图片描述
在这里插入图片描述
在反汇编代码窗口的左侧蓝色小圆点处使用鼠标单击,就能够很方便的在这行代码处设置一个断点:
在这里插入图片描述
在成功的设置好断点以后,接下来我们需要使用qemu工具将ls命令以等待调试模式启动:

$ sudo chroot . ./qemu-mips-static -g 1234 ./bin/ls

读者需要注意的是,这里使用的qemu-mips-static命令使用了-g 1234的选项和参数,这样就使得ls命令以等待调试模式启动了,等待调试服务的端口是1234。

现在我们需要回到IDA中,在IDA菜单中依次选择“Debugger”->“select debugger”:
在这里插入图片描述

然后在弹出的窗口中选择“Remote GDB debugger”:
在这里插入图片描述
然后再在IDA的菜单中依次选择“Debugger”->“Process options”:
在这里插入图片描述
在弹出的窗口中设置好远程调试服务器的IP地址和端口号,这里因为我们使用的IDA和qemu都运行在同一个机器中,所以我们填了127.0.0.1:1234:
在这里插入图片描述
设置好远程调试服务的IP和端口号后,我们再次回到IDA的菜单栏中,依次点击:“Debugger”->“Attach to process”:
在这里插入图片描述
在弹出的窗口中选择ID为0的进程,然后单击OK按钮:
在这里插入图片描述
此时会弹出提示对话框,提示你已经成功的附加到了待调试的进程上:
在这里插入图片描述
点击OK按钮后,IDA的远程调试器会将PC指针停留在程序运行的第一条汇编指令处:
在这里插入图片描述
此时,按下F9快捷键可使进程全速运行,直到遇到断点为止:
在这里插入图片描述在这里插入图片描述
因为我们刚刚在ls_main函数的起始处设置了一个断点,所以,按下F9快捷键后,进程在执行到这个断点所在位置时停了下来。接下来,我们就能够使用F8按键进行单步调试了。也可以使用F7按键以单步进入函数的方式进行调试。

如果你想在单步调试的同时,实时检测栈内存数据变化,可以在IDA左下方的“Hex View”中使用鼠标右键,依次选择“Synchronize with”->"SP"选项,此时,若再次使用F8进行单步调试时,就能够发现栈空间内存内容在不断发生变化。这在以后观察栈空间的缓冲区溢出时特别有用:

在这里插入图片描述
如果要终止动态调试过程,可在工具栏中点击蓝色方块的结束调试图标:
在这里插入图片描述
最后,我们来小结一下:

今天我们一起总结了使用IDA联合qemu的方式对MIPS-Linux架构的路由器固件程序进行动态调试的方法。整篇文章更多的是实际操作,理论的东西比较少,但希望能够为你带来帮助。

谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后知晚觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值