qemu四种远程调试方法

前言

调试环境:

Ubuntu16.04

IDA6(6以上版本都行)

gdb-multiarch(支持不同架构)

gdbserver(不同架构不同版本,网上可自行找到别人编译好的直接使用)

qemu用户模式+IDA

1,qemu调试模式挂起程序

sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/httpd

-g 参数指定调试端口

程序被挂起,等待调试:

在这里插入图片描述

2,IDA加载httpd程序

配置IDA调试模式:

在这里插入图片描述

三步走:

在这里插入图片描述

①配置IP和PORT(我IDA是本地的,有方法可以不用wine也可支持IDA)

在这里插入图片描述

②选择0,OK

在这里插入图片描述

②执行完程序就被调试加载上了

在这里插入图片描述

③F9运行,程序就跑起来可以进行调试跟踪了

在这里插入图片描述

qemu用户模式+GDB

方式一(gdb remote)

1,qemu调试执行挂起

sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/httpd

2,gdb连接调试

gdb-multiarch -q ./bin/httpd    #-q参数,忽略一些警告提示

pwndbg> set  architecture arm
The target architecture is assumed to be arm
pwndbg> target remote 127.0.0.1:1234
pwndbg>

在这里插入图片描述
继续gdb中执行c,程序即可跑起来。

附:

为了避免每次调试重复性的输入相同的命令,可以集成脚本加载。

例如,脚本内容

#dbgscript
set architecture arm
target remote 127.0.0.1:1234
c

gdb执行-x加载脚本

gdb-multiarch -q ./bin/httpd -x dbgscript

方式二(gdb attach)

这种限需要你已知一些条件,例如,调试程序开启的端口,通过端口查看PID,然后attach pid开启调试。

1,qemu启动程序(注意:跟上面-g挂起不同,这里直接启动了程序)

sudo chroot ./ ./qemu-arm-static  ./bin/httpd

在这里插入图片描述
2,通过端口查看PID

查看PID的几种不同的方法

方式一
netstat -pantu | grep 80 
方式二
netstat -pantu | grep 80
方式三
sudo ss -tunlp

在这里插入图片描述
3,gdb attach pid连接

在这里插入图片描述
:两种调试方法加载的libc可能不同,注意对比。(下图说明在读取libc)

在这里插入图片描述
查看libc的两种方法

方法一:
sudo netstat -tunpl|grep 80 #查看进程PID
sudo cat /proc/12422/maps   #查看libc情况
方法二:gdb的vmmap功能

qemu系统模式+GDB

前提:调试对象和调试的宿主机一定能ping通。

在这里插入图片描述
下载qemu-system需要的kernel和虚拟硬盘文件:

wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress

1,启动qemu虚拟机

sudo qemu-system-arm -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress -initrd initrd.img-3.2.0-4-vexpress \
-drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
-append "root=/dev/mmcblk0p2 console=ttyAMA0" \
-net nic -net tap,ifname=tap0,script=no,downscript=no -nographic

script 和 downscript 两个选项的作用是告诉 QEMU 在启动系统的时候是否调用脚本自动配置网络环境,如果这两个选项为空,那么 QEMU 启动和退出时会自动选择第一个不存在的 tap 接口(通常是 tap0)为参数,调用脚本 /etc/qemu-ifup 和 /etc/qemu-ifdown。

附:

这里请先了解下qemu网络配置相关知识:QEMU 网络配置一把梭

2,利用scp上传所需文件到虚拟机中

scp -r [file]  root@ip:/root/  #宿主机执行

3,利用gdbserver挂起程序

./gdbserver-7.7.1-armhf-eabi5-v1-sysv 0.0.0.0:1234 ./bin/httpd

调试启动需要对应架构的gdbserver,大家可自行百度找找。

找不到的同学看这里,我又帮你找好了哦

4,gdb连接(同上)

gdb-multiarch -q ./bin/httpd    #-q参数,忽略一些警告提示

pwndbg> set  architecture arm
The target architecture is assumed to be arm
pwndbg> target remote 127.0.0.1:1234
pwndbg>

5,完成,可以开始跟踪数据调试了。

在这里插入图片描述
这种就没必要attch连接了,因为都不在同一个主机里面了。

系统模式+IDA

1,gdbserver挂起程序

chroot ./ sh #这里匹配自己对应的目录,失败就切换目录多试试,不执行这条命令切换根目录,下面的命令执行不起来

./gdbserver-7.7.1-armhf-eabi5-v1-sysv 0.0.0.0:1234 ./bin/httpd

2,IDA三步走

在这里插入图片描述
3,调试起来了,但不太推荐这种方法

原因如下:终端调试退不出来,不能再次进行调试。(里面报的一些错误提示也不容易解决)

在这里插入图片描述

总结

IDA调试方便你看全局更加清晰。
GDB调试指令功能更加强大,可以查看各种数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值