[TOC]

说明

调试环境:

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

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

附:

这里请先了解下qemu网络配置相关知识:[QEMU 网络配置一把梭]https://wzt.ac.cn/2021/05/28/QEMU-networking/

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,大家可自行百度找找。

[找不到的同学看这里,我又帮你找好了哦]https://gitee.com/h4lo1/HatLab_Tools_Library/tree/master/%E9%9D%99%E6%80%81%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F/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调试指令功能更加强大,可以查看各种数据。

以上方法各有优劣吧,各位可以结合不同场景需求使用不同的方法。

欢迎交流

Q群198854910

点击收藏 | 2 关注 | 1 打赏
  • 动动手指,沙发就是你的了!
登录 后跟帖