查看原文
其他

QEMU+IDA远程调试mips可执行文件

伤字号 看雪学院 2019-05-26

前言

qemu的远程调试非常简单,开启-g参数绑定本地端口即可,只是其中IDA需要进行一定的设置才能调试mips架构的二进制文件,并暂停进程进行调试。(关于Linux中如何运行IDA以及搭建buildroot的环境,网上教程比较多,也可以找我交流。)

QEMU的使用模式

使用模式用于运行单个可执行文件,由于部分可执行文件运行时需要结合运行库,因此需要结合chroot指令,将运行时的root路径修改为【目标可执行文件】的文件系统的root目录。

另外在使用qemu仿真可执行文件时,qemu需要依赖部分宿主机的系统库文件,我这里采用的方式比较简单粗暴,直接将宿主机的某些库文件复制到目标文件系统中chroot后的绝对路径,然后才能正常运行,步骤如下:

cd squashfs/   进入需要仿真的可执行文件根目录下
cp $(which qemu-mips) ./    将qemu对应架构的使用模式可执行文件复制到当前文件夹下便于执行,具体需要复制的架构可以使用readelf -h file查看目标可执行文件得出。
ldd qemu-mips    查看qemu-mips执行需要的依赖,如下图,其中第一行的linux-vdso.so.1文件驻留于linux的内存中,因此不需要手动进行复制:


直接用简单粗暴的脚本把依赖复制到对应的位置上:

gedit move.sh    编写脚本将依赖复制到目标可执行文件的文件系统中的对应位置,move.sh内容如下:




就可以正常使用chroot+qemu使用模式的组合了。


使用chroot命令,结合之前的qemu-mips环境,随便运行一个固件内的可执行文件:

 


上面为uhttpd服务传入的参数分别表示:


    •     -p:监听端口

    •     -h:http文件根目录位置

    •     -c:http配置文件位置


可以看到这次uhttpd服务并没有直接被执行,而是等待我们去链接并调试。在另一边打开IDA,并选择Debugger中的Attach,下面选择Remote gdb debugger:


  

弹出如下对话框:

 


在hostname中填入运行待调试可执行程序的主机IP、Port中填入之前-g参数附加的端口号。将设置完毕后的配置保存为默认网络设置。


由于这里调试的是mips架构的可执行文件,所以需要点击上图中的Debug options进行高级设置,首先勾选Events中的Suspend on debugging start,意为在调试开始时暂停进程:

  


接下来就是重点了,需要指定目标进程的架构,在上图中右下角Set  specific options中选择mips:




选择了mips架构后,需要选择是大端序还是小端序,这些信息使用readelf -h file就能查看到,我这里采用的例子是大端序的文件。


设置完毕后,如果前面的配置都是正确的,会弹出如下对话框:

 


选择attach一个目标主机端口上正在运行的线程,选择第一个即可,结果如下:




提示已经成功attach到了该进程上,现在就可以浏览和调试可执行程序的运行过程,以及内存情况。如下图所示:




到这里,动态调试设置成功,各位二进制大佬就可以各显神通了。



相关参考


另外关于mips的反编译工具retdec的使用,其实在retdec的github readme里面介绍了,github地址如下:


https://github.com/avast-tl/retdec


编译过程在 build-and-installation 小节下面,使用时运行下面的命令即可:


$RETDEC_INSTALL_DIR/bin/retdec-decompiler.sh test.exe


或者参考这篇帖子:


https://bbs.pediy.com/thread-227079.htm


之前还发现了一款可以在源码中检出危险函数调用的工具flawfinder。


  • 官网:https://www.dwheeler.com/flawfinder/

  • debian下载方式 sudo apt-get install flawfinder


欢迎各位指点交流。




看雪ID: 伤字号  

https://bbs.pediy.com/user-671705.htm




本文由看雪论坛 伤字号 原创

转载请注明来自看雪社区






热门技术文章推荐:





戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存