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系统

  1. 创建一个专用文件夹,放入空镜像和Ubuntu ISO文件
  2. 执行安装命令(根据镜像格式调整):
# 对于.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
  1. 按照命令行界面完成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 关机状态操作

  1. 创建快照:
qemu-img snapshot -c snapshot_name vm_disk.qcow2
  1. 恢复快照:
qemu-img snapshot -a snapshot_name vm_disk.qcow2
  1. 其他操作:
# 列出快照
qemu-img snapshot -l vm_disk.qcow2

# 删除快照
qemu-img snapshot -d snapshot_name vm_disk.qcow2

5.2 运行状态操作

  1. 进入QEMU monitor(快捷键Option+Control+2)
  2. 创建快照:
savevm snapshot_name
  1. 恢复快照:
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. 最佳实践建议

  1. 镜像格式选择:优先使用qcow2格式,支持快照和动态分配空间
  2. 资源分配:根据主机配置调整内存(-m)和CPU核心数(-smp)
  3. 网络配置
    • 添加多个端口转发满足不同需求(SSH、调试端口、题目端口)
    • 示例:hostfwd=tcp::2222-:22,hostfwd=tcp::1234-:1234
  4. 调试流程
    • 上传二进制文件到虚拟机
    • 使用socat暴露题目端口
    • 在主机上使用GDB多架构插件进行远程调试
  5. 快照管理:在关键步骤前创建快照(如安装完基础环境、配置好网络等)

8. 常见问题解决

  1. 性能问题

    • 启用KVM加速(在支持的主机上添加--enable-kvm)
    • 调整CPU类型:-cpu host
  2. 架构兼容性问题

    • 确保使用正确的QEMU可执行文件(qemu-system-x86_64 vs qemu-system-aarch64)
    • 安装多架构支持库
  3. 网络连接问题

    • 检查端口转发规则是否正确
    • 确认虚拟机内服务已启动并监听正确端口

通过以上配置,M1芯片用户可以在ARM架构的Mac上完美运行x86架构的CTF/PWN环境,并进行高效的二进制漏洞分析和调试。

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安装: 2.2 创建虚拟磁盘镜像 选择以下任意一种格式创建空镜像(推荐qcow2格式,支持快照): 2.3 下载Ubuntu镜像 从Ubuntu官网下载ISO镜像: https://cn.ubuntu.com/download/alternative-downloads 3. 安装Ubuntu系统 创建一个专用文件夹,放入空镜像和Ubuntu ISO文件 执行安装命令(根据镜像格式调整): 按照命令行界面完成Ubuntu安装(参考: https://zhuanlan.zhihu.com/p/578074736) 4. 启动与网络配置 4.1 基本启动 4.2 端口转发配置 设置SSH端口转发(主机2222→虚拟机22): 多端口转发示例(SSH+HTTP): 5. 快照管理 5.1 关机状态操作 创建快照: 恢复快照: 其他操作: 5.2 运行状态操作 进入QEMU monitor(快捷键Option+Control+2) 创建快照: 恢复快照: 5.3 镜像格式转换 将raw/img转换为qcow2格式: 6. 扩展功能 6.1 调整虚拟磁盘大小 6.2 Ghidra自动化脚本 以下Python脚本可简化调试流程(需在Ghidra中运行): 7. 最佳实践建议 镜像格式选择 :优先使用qcow2格式,支持快照和动态分配空间 资源分配 :根据主机配置调整内存(-m)和CPU核心数(-smp) 网络配置 : 添加多个端口转发满足不同需求(SSH、调试端口、题目端口) 示例: hostfwd=tcp::2222-:22,hostfwd=tcp::1234-:1234 调试流程 : 上传二进制文件到虚拟机 使用socat暴露题目端口 在主机上使用GDB多架构插件进行远程调试 快照管理 :在关键步骤前创建快照(如安装完基础环境、配置好网络等) 8. 常见问题解决 性能问题 : 启用KVM加速(在支持的主机上添加 --enable-kvm ) 调整CPU类型: -cpu host 架构兼容性问题 : 确保使用正确的QEMU可执行文件(qemu-system-x86_ 64 vs qemu-system-aarch64) 安装多架构支持库 网络连接问题 : 检查端口转发规则是否正确 确认虚拟机内服务已启动并监听正确端口 通过以上配置,M1芯片用户可以在ARM架构的Mac上完美运行x86架构的CTF/PWN环境,并进行高效的二进制漏洞分析和调试。