首页
论坛
课程
招聘
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝

[原创]QEMU+IDA远程调试mips可执行文件

2018-8-10 00:14 16100

[原创]QEMU+IDA远程调试mips可执行文件

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

【2018-08-16更新开始加一个qemu-mips的脚本吧,解决chroot之后qemu-mips运行找不到依赖库然后报错文件不存在的:

先介绍一下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使用模式的组合了。
【2018-08-16更新结束】

使用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

欢迎各位指点交流。
最后于 2018-8-16 09:57 被伤字号编辑 ,原因: 添加了qemu-mips+chroot后提示No file or directory named qemu-mips错误的解决办法
打赏 + 1.00
打赏次数 1 金额 + 1.00
 
赞赏  junkboy   +1.00 2018/08/10
最新回复 (29)
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-10 07:45
2
0
发帖这个编辑器直接粘贴图片上来发布之后就不显示了,必须得点击上面的插入图片的按钮上传,很迷。。。
雪    币: 427
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:100 )
在线值:
发帖
回帖
粉丝
蓝色淡风 活跃值 2 2018-8-10 15:10
3
0
楼主可以考虑建个群,交流交流
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-10 15:43
4
0
蓝色淡风 楼主可以考虑建个群,交流交流
emmm。。。我水平有限。。。感觉建群了能解决的问题也不多。。
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2018-8-13 19:26
5
0
楼主辛苦。问个额外的问题,在使用IDA 远程调试arm/mips架构的程序时,如何跟踪由execve()起来的程序? 貌似gdb可以使用catch exec,但在使用gdb-multiarch时遇到几个问题:1) 使用ni单步步过好像也会单步进入,和si效果一样;2) 在进行远程调试时感觉很慢(比IDA要慢),另外会出现指令和地址对不上的情形,所以暂时没有尝试使用gdb-multiarch去执行catch exec来进行跟踪调试。
最后于 2018-8-13 19:32 被照片记录谁编辑 ,原因:
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-14 09:44
6
0
照片记录谁 楼主辛苦。问个额外的问题,在使用IDA 远程调试arm/mips架构的程序时,如何跟踪由execve()起来的程序? 貌似gdb可以使用catch exec,但在使用gdb-multiarch时遇到几 ...
先静态确定了execve调用处的位置,调试的时候再直接跳转到对应地址下断。另外gdb调试子进程可以用set follow-fork-mode试试。
而且话说单步步入之后不就可以调试execve的过程了嘛?gdb-multiarch我暂时也没用过,不是特别了解
雪    币: 6639
活跃值: 活跃值 (64)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
bxc 活跃值 6 2018-8-15 10:04
7
0
感谢分享!!!
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-16 10:22
8
0
加了一个chroot . ./qemu-mips报错的解决方案
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2018-8-16 21:22
9
0
伤字号 先静态确定了execve调用处的位置,调试的时候再直接跳转到对应地址下断。另外gdb调试子进程可以用set follow-fork-mode试试。 而且话说单步步入之后不就可以调试execve的过程 ...
多谢。另外,gdb-multiarch是一个与gdb类似的工具,但它支持多种架构,这样就不用针对每种架构都要去找对应架构的gdb了。当然,也可以在直接使用IDA Pro。
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2018-8-16 21:24
10
0
伤字号 加了一个chroot . ./qemu-mips报错的解决方案
也可以试试采用对应架构的qemu-static版本,比如qemu-mips-static,这样chroot之后就不会有qemu-mips-static找不到依赖库的问题了。
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-17 09:32
11
0
照片记录谁 也可以试试采用对应架构的qemu-static版本,比如qemu-mips-static,这样chroot之后就不会有qemu-mips-static找不到依赖库的问题了。
加static需要重新编译  我比较懒 就喜欢用apt install的版本
雪    币: 763
活跃值: 活跃值 (64)
能力值: (RANK:830 )
在线值:
发帖
回帖
粉丝
仙果 活跃值 19 2018-8-17 14:55
12
0
【2018-08-16更新开始】加一个qemu-mips的脚本吧,解决chroot之后qemu-mips运行找不到依赖库然后报错文件不存在的:
这方面加一个吧,分析的时候确实遇到了这个问题,一直没有解决
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-17 15:05
13
0
仙果 【2018-08-16更新开始】加一个qemu-mips的脚本吧,解决chroot之后qemu-mips运行找不到依赖库然后报错文件不存在的: 这方面加一个吧,分析的时候确实遇到了这个问题,一直没有 ...
加。。加啥 解决依赖库的脚本吗?
我在更新那段内容里那个迁移依赖库的move.sh就能解决问题了
或者还是其他别的什么问题呢?
雪    币: 763
活跃值: 活跃值 (64)
能力值: (RANK:830 )
在线值:
发帖
回帖
粉丝
仙果 活跃值 19 2018-8-17 15:36
14
0
伤字号 加。。加啥 解决依赖库的脚本吗? 我在更新那段内容里那个迁移依赖库的move.sh就能解决问题了 或者还是其他别的什么问题呢?
我回去试一下,这个问题,困扰几天了
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-17 16:00
15
0
仙果 我回去试一下,这个问题,困扰几天了
好的。。。把ldd之后打印出来的所有依赖库文件复制到当前固件的根目录下面的相对路径就行了  只是中间有些目录需要手动创建  我在那个move.sh脚本里应该写的都比较明白。。
雪    币: 2
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
regedit小表 活跃值 2018-8-17 18:36
16
0
,那个,请问,用http是因为比较方便吗
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2018-8-17 21:10
17
0
伤字号 加static需要重新编译 我比较懒 就喜欢用apt install的版本
我用的Ubuntu,直接使用apt-get安装的static版本的qemu。
最后于 2018-8-17 21:11 被照片记录谁编辑 ,原因:
雪    币: 219
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2018-8-17 21:13
18
0
regedit小表 ,那个,请问,用http是因为比较方便吗
用http只是一个示例吧,其他的程序都大同小异。
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2018-8-20 09:55
19
0
照片记录谁 用http只是一个示例吧,其他的程序都大同小异。
是的。。实际情况中直接调试http的场景并不多见
雪    币: 2683
活跃值: 活跃值 (20)
能力值: (RANK:510 )
在线值:
发帖
回帖
粉丝
gjden 活跃值 12 2018-8-22 10:49
20
0
蓝色淡风 楼主可以考虑建个群,交流交流
建议在帖子里交流,这样大家交流心得可以让更多后来者看到!
雪    币: 427
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:100 )
在线值:
发帖
回帖
粉丝
蓝色淡风 活跃值 2 2018-8-22 12:57
21
0
gjden 建议在帖子里交流,这样大家交流心得可以让更多后来者看到!
嗯嗯
雪    币: 1718
活跃值: 活跃值 (29)
能力值: ( LV13,RANK:390 )
在线值:
发帖
回帖
粉丝
sudozhange 活跃值 5 2018-12-17 22:42
22
0
仙果 我回去试一下,这个问题,困扰几天了
也可以将mips-gcc编译目录(bulidroot/output)下的库文件直接拷贝到当前目录的lib目录下
雪    币: 76
活跃值: 活跃值 (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kongfubull 活跃值 2018-12-19 09:19
23
0
如果是从固件里面提取出来的文件系统,把整个文件系统目录扔到qemu里面,chroot到当前目录就不会有问题了
雪    币: 425
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FunRoot 活跃值 2019-4-28 09:50
24
0
我通过move.sh解决了依赖库的问题,但在sudo chroot . ./qemu.mips bin/boa又报了一个错误:
qemu:handle_cpu_signal received signal outside vCPU context @ pc=0x562daa0b8570
qemu:handle_cpu_signal received signal outside vCPU context @ pc=0x7f4cd373a179
 想问问您这是什么问题,该如何解决。
最后于 2019-4-28 10:43 被FunRoot编辑 ,原因:
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2019-6-3 10:34
25
0
FunRoot 我通过move.sh解决了依赖库的问题,但在sudo chroot . ./qemu.mips bin/boa又报了一个错误:q ...
有截图嘛?盲猜一个qemu的架构和固件的架构不一致吧。。。
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2019-6-3 11:15
26
0
FunRoot 我通过move.sh解决了依赖库的问题,但在sudo chroot . ./qemu.mips bin/boa又报了一个错误:q ...
我看了一下报同样的错的其他问题   也有人说是QEMU版本的原因
雪    币: 0
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
malokch 活跃值 2 2019-6-3 11:19
27
0
wine ida也是挺蛋疼的
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2019-6-3 11:41
28
0
malokch wine ida也是挺蛋疼的
其实也可以在另外一个windows上远程连接  毕竟本来就是远程调试   我是为了发帖方便就偷了个懒全都在虚拟机里面搞了
雪    币: 1938
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vinadiak 活跃值 2019-9-21 22:02
29
0
请问下IDA如何加载固件程序的符号表啊,连接是连接了,但是符号表没有加载进去
雪    币: 3310
活跃值: 活跃值 (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
伤字号 活跃值 2019-9-23 11:13
30
0
wx__y 请问下IDA如何加载固件程序的符号表啊,连接是连接了,但是符号表没有加载进去
这个你需要看他的固件里面有没有包含符号表了,可以参考一下这篇文章:https://www.cnblogs.com/yangmzh3/p/11231423.html
游客
登录 | 注册 方可回帖
返回