目录

  • 前言
  • qemu用户模式+IDA
  • qemu用户模式+GDB
  • 方式一(gdb remote)
  • 方式二(gdb attach)
  • qemu系统模式+GDB
  • 系统模式+IDA
  • 总结


前言

调试环境:

Ubuntu16.04

IDA6(6以上版本都行)

gdb-multiarch(支持不同架构)

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

qemu用户模式+IDA

1,qemu调试模式挂起程序

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

-g 参数指定调试端口

程序被挂起,等待调试:

qemu调试内核arm qemu 调试_加载

2,IDA加载httpd程序

配置IDA调试模式:

qemu调试内核arm qemu 调试_qt_02

三步走:

qemu调试内核arm qemu 调试_加载_03

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

qemu调试内核arm qemu 调试_stm32_04

②选择0,OK

qemu调试内核arm qemu 调试_windows_05

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

qemu调试内核arm qemu 调试_qemu调试内核arm_06

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

qemu调试内核arm qemu 调试_qemu调试内核arm_07

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>

qemu调试内核arm qemu 调试_stm32_08


继续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

qemu调试内核arm qemu 调试_windows_09


2,通过端口查看PID

查看PID的几种不同的方法

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

qemu调试内核arm qemu 调试_windows_10


3,gdb attach pid连接

qemu调试内核arm qemu 调试_加载_11


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

qemu调试内核arm qemu 调试_stm32_12


查看libc的两种方法

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

qemu系统模式+GDB

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

qemu调试内核arm qemu 调试_qemu调试内核arm_13


下载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,完成,可以开始跟踪数据调试了。

qemu调试内核arm qemu 调试_windows_14


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

系统模式+IDA

1,gdbserver挂起程序

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

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

2,IDA三步走

qemu调试内核arm qemu 调试_qemu调试内核arm_15


3,调试起来了,但不太推荐这种方法

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

qemu调试内核arm qemu 调试_windows_16

总结

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