M1芯片下玩pwn,GDB调试的一些尝试「qemu」
字数 1257 2025-08-23 18:31:25
M1芯片下使用QEMU进行PWN和GDB调试的完整指南
1. QEMU简介与优势
QEMU是一个支持跨平台虚拟化的虚拟机,其核心优势在于跨指令集支持:
- 传统虚拟机工具(如VMware/VirtualBox)只能在x86计算机上虚拟x86环境
- QEMU可以在x86上虚拟ARM计算机,反之亦然
- 特别适合M1芯片(Mac ARM架构)用户运行x86架构的CTF/PWN环境
2. 环境准备
2.1 安装QEMU
在M1 Mac上使用Homebrew安装:
brew install qemu
2.2 创建虚拟磁盘镜像
选择以下任意一种格式创建空镜像(推荐qcow2格式,支持快照):
# 创建20GB的raw格式镜像
qemu-img create ubuntu-20.04.5-amd64.img 20G
# 明确指定raw格式
qemu-img create -f raw ubuntu-20.04.5-amd64.raw 20G
# 创建qcow2格式镜像(推荐)
qemu-img create -f qcow2 ubuntu-20.04.5-amd64.qcow2 20G
2.3 下载Ubuntu镜像
从Ubuntu官网下载ISO镜像:
https://cn.ubuntu.com/download/alternative-downloads
3. 安装Ubuntu系统
- 创建一个专用文件夹,放入空镜像和Ubuntu ISO文件
- 执行安装命令(根据镜像格式调整):
# 对于.img/.raw格式
qemu-system-x86_64 -m 2048 -smp 2 ubuntu-20.04.5-amd64.img -cdrom ubuntu-22.04.3-live-server-amd64.iso
# 对于qcow2格式
qemu-system-x86_64 -m 2048 -smp 2 ubuntu-20.04.5-amd64.qcow2 -cdrom ubuntu-22.04.3-live-server-amd64.iso
- 按照命令行界面完成Ubuntu安装(参考: https://zhuanlan.zhihu.com/p/578074736)
4. 启动与网络配置
4.1 基本启动
qemu-system-x86_64 -m 2048 -smp 2 ubuntu-20.04.3-amd64.qcow2
4.2 端口转发配置
设置SSH端口转发(主机2222→虚拟机22):
qemu-system-x86_64 -m 2048 -smp 2 -net user,hostfwd=tcp::2222-:22 -net nic ubuntu-20.04.3-amd64.qcow2
多端口转发示例(SSH+HTTP):
qemu-system-x86_64 -m 2048 -smp 2 -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80 -net nic ubuntu-20.04.3-amd64.qcow2
5. 快照管理
5.1 关机状态操作
- 创建快照:
qemu-img snapshot -c snapshot_name vm_disk.qcow2
- 恢复快照:
qemu-img snapshot -a snapshot_name vm_disk.qcow2
- 其他操作:
# 列出快照
qemu-img snapshot -l vm_disk.qcow2
# 删除快照
qemu-img snapshot -d snapshot_name vm_disk.qcow2
5.2 运行状态操作
- 进入QEMU monitor(快捷键Option+Control+2)
- 创建快照:
savevm snapshot_name
- 恢复快照:
loadvm snapshot_name
5.3 镜像格式转换
将raw/img转换为qcow2格式:
qemu-img convert -f raw -O qcow2 ubuntu-20.04.3-amd64.img ubuntu-20.04.3-amd64.qcow2
6. 扩展功能
6.1 调整虚拟磁盘大小
qemu-img resize your_disk_image.qcow2 100G
6.2 Ghidra自动化脚本
以下Python脚本可简化调试流程(需在Ghidra中运行):
# coding: utf-8
import subprocess
def comd():
choices = [
"连接远程服务器至工作目录",
"将当前二进制文件上传至服务器「并打开shell」",
"将当前二进制文件上传至服务器「并启动GDB调试」",
"将当前二进制文件上传至服务器「并使用socat开启题目」"
]
selected_option = askChoice("远端调试插件", "选择一个功能:", choices, "")
return selected_option
def updata_vps(comd):
current_program = getCurrentProgram()
program_name = current_program.getDomainFile().getName()
file_location = current_program.getExecutablePath()
if comd == "连接远程服务器至工作目录":
command_to_execute = "ssh -t -p 2222 user@host 'cd /path;/bin/bash'\n"
elif comd == "将当前二进制文件上传至服务器「并打开shell」":
command_to_execute = f"scp -P 2222 {file_location} user@host:/path && ssh -t -p 2222 user@host 'cd /path&&chmod +x {program_name};/bin/bash'\n"
elif comd == "将当前二进制文件上传至服务器「并启动GDB调试」":
command_to_execute = f"scp -P 2222 {file_location} user@host:/path && ssh -t -p 2222 user@host 'cd /path&&chmod +x {program_name}&&gdb {program_name};/bin/bash'\n"
elif comd == "将当前二进制文件上传至服务器「并使用socat开启题目」":
command_to_execute = f"scp -P 2222 {file_location} user@host:/path && ssh -t -p 2222 user@host 'cd /path&&chmod +x {program_name}&&socat TCP-LISTEN:1337,reuseaddr,fork EXEC:./{program_name};/bin/bash'\n"
print("[+]远程题目地址:nc host 1337")
# 在Mac上打开新终端执行命令
applescript = f'tell application "Terminal" activate do script "{command_to_execute}" end tell'
subprocess.call(['osascript', '-e', applescript])
try:
updata_vps(comd())
except Exception as e:
print("[x]请检查网络连接情况")
print("An error occurred:", e)
7. 最佳实践建议
- 镜像格式选择:优先使用qcow2格式,支持快照和动态分配空间
- 资源分配:根据主机配置调整内存(-m)和CPU核心数(-smp)
- 网络配置:
- 添加多个端口转发满足不同需求(SSH、调试端口、题目端口)
- 示例:
hostfwd=tcp::2222-:22,hostfwd=tcp::1234-:1234
- 调试流程:
- 上传二进制文件到虚拟机
- 使用socat暴露题目端口
- 在主机上使用GDB多架构插件进行远程调试
- 快照管理:在关键步骤前创建快照(如安装完基础环境、配置好网络等)
8. 常见问题解决
-
性能问题:
- 启用KVM加速(在支持的主机上添加
--enable-kvm) - 调整CPU类型:
-cpu host
- 启用KVM加速(在支持的主机上添加
-
架构兼容性问题:
- 确保使用正确的QEMU可执行文件(qemu-system-x86_64 vs qemu-system-aarch64)
- 安装多架构支持库
-
网络连接问题:
- 检查端口转发规则是否正确
- 确认虚拟机内服务已启动并监听正确端口
通过以上配置,M1芯片用户可以在ARM架构的Mac上完美运行x86架构的CTF/PWN环境,并进行高效的二进制漏洞分析和调试。