M 系列 Mac 上的 Pwn 环境搭建

1. 前言

更换到 M 系列 Mac 之后,原先在 x86 设备上那套 Pwn 环境基本就无法原样迁移了。

一方面,macOS 本身是 ARM64 架构,另一方面,绝大多数 CTF 题目默认运行环境仍然是 Linux x86_64 + glibc
两者在指令集、系统调用接口、动态链接器、libc 实现等方面都存在明显差异,如果直接在 macOS 上调试,很容易出现:

  • 本地调得“好好的”,远端一上线就炸;
  • 一些典型利用手法(堆风水、__libc_start_main 链、tcache 细节等)完全对不上。

因此,更稳妥的思路是:

在 M 系列 Mac 上通过 UTM 模拟一台 x86_64 的 Ubuntu Server,将其作为专门的 Pwn 调试环境,再通过共享目录的方式与宿主机交互。

本文记录整个环境搭建过程,偏向“可复现”的操作步骤,供之后查阅。


2. 环境选择与整体思路

2.1 虚拟化方案的选择

在 M 系列 Mac 上常见的做法主要有:

  • 使用 Docker + qemu 运行 linux/amd64 镜像;
  • 使用 Parallels Desktop 等商业虚拟化软件;
  • 使用 UTM 直接模拟整机。

综合考虑:

  • 需要完整的 x86_64 Linux 环境(方便调 libc / ld.so / kernel 参数);
  • 不依赖商业软件,便于替换和迁移;
  • 可以灵活配置共享目录、网络等;

本文采用 UTM + Ubuntu Server 22.04 (amd64) 的方案。UTM 底层基于 qemu,可以在 ARM 的 M 系列 Mac 上模拟 x86_64 架构。

2.2 使用场景与工作流

整个环境的定位是:

  • 虚拟机 (VM):
    作为“目标环境”,负责编译、运行、调试二进制,安装 Pwn 工具链等;
  • 宿主机 (macOS):
    负责代码编辑、文件管理、浏览器等“体验相关”的部分。

典型工作流为:

  1. 宿主机在某个目录(如 ~/ctf)中整理题目和脚本;
  2. UTM 将该目录映射为虚拟机中的 /mnt/shared
  3. 在虚拟机中对共享目录内的程序进行编译、运行和调试。

3. UTM 与 Ubuntu 镜像准备

3.1 UTM 安装

UTM 可从其 GitHub 或官方网站获取,下载对应的 macOS 版本,按照提示安装即可。

安装完成后,在「应用程序」中打开 UTM,后续所有操作均在此完成。

3.2 Ubuntu Server 镜像获取

建议使用 LTS 版本的 Ubuntu Server,这里以 Ubuntu Server 22.04 为例。

需要特别注意的是:

下载时必须选择 amd64 / x86_64 架构镜像,而非 arm64

示例下载地址:

下载完成后,得到一个 .iso 文件,后续会作为虚拟机启动镜像使用。


4. 在 UTM 中创建 x86_64 Ubuntu 虚拟机

4.1 新建虚拟机

  1. 打开 UTM,点击左上角 +Create New
  2. 在第一步中选择 Emulate(M 系列 Mac 要模拟 x86_64 只能使用 Emulate)。
  3. Guest OS 选择 Linux
  4. 架构(Architecture)选择 x86_64
  5. 在 Boot Image 一栏,选择刚刚下载的 ubuntu-22.04.5-live-server-amd64.iso
  6. 继续下一步,配置虚拟机资源。

4.2 资源与磁盘配置参考

根据实际硬件情况,可以设置为:

  • 内存:4096 MB(4G)或更高;
  • CPU:2~4 核;
  • 磁盘:新建虚拟磁盘,容量建议在 40G 左右;

网络模式选择 Shared Network (NAT) 即可,之后可以直接从虚拟机访问外部网络。

保存配置后,启动该虚拟机,即可进入 Ubuntu Server 安装流程。


5. Ubuntu Server 安装过程

5.1 基本安装步骤概览

启动虚拟机后,按照 Ubuntu 安装器的提示依次完成:

  1. 语言与键盘布局
    • Language:选择 English;
    • Keyboard:默认 English (US) 即可。
  2. 网络配置
    • 默认 DHCP,能正常联网即可;
    • 无需在此阶段做额外复杂配置。
  3. 镜像源与代理
    • 先使用默认设置完成安装,后续在系统内部更换国内镜像源;
    • 若有 HTTP 代理需求,也可在系统安装完成后统一配置。
  4. 磁盘分区
    • 选项 Use an entire disk
    • 使用之前创建的虚拟磁盘,分区策略保持默认即可。
  5. 用户与主机名
    • 设置方便记忆的主机名(如 pwnbox);
    • 创建日常使用的用户,设置密码并牢记。
  6. OpenSSH Server(推荐)
    • 安装时勾选 Install OpenSSH server,后续可在 macOS 上直接通过 ssh 连接虚拟机。
  7. 完成安装并重启
    • 安装完成后,选择 Reboot
    • 若提示移除安装介质,在 UTM 中弹出 ISO 或忽略提示,按回车继续。

系统重启后,进入终端登录界面:

Ubuntu 22.04 LTS pwnbox tty1

pwnbox login: <your-username>
Password: ******

登录成功即表示基础系统安装完成。


6. 系统基础配置

6.1 更新系统与基础工具

登录后,首先更新软件包索引并进行升级:

sudo apt update
sudo apt upgrade -y

随后安装一些通用工具:

sudo apt install -y \
    build-essential git vim tmux htop \
    netcat-traditional socat strace ltrace file unzip \
    net-tools

其中:

  • build-essential:编译题目代码;
  • netcat-traditionalsocat:本地起服务、模拟远程环境;
  • straceltrace:系统调用和库函数跟踪;
  • net-tools:提供 ifconfig,便于查看网络信息。

6.2(可选)更换国内镜像源

在国内环境下,使用官方源可能会有较大的网络延迟,可以将 /etc/apt/sources.list 改为国内镜像源。
一般流程如下(示例,仅供参考):

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
# 按个人习惯替换为阿里云 / 清华 / 中科大等镜像
sudo apt update

7. 共享目录配置(Mac 与虚拟机之间的文件同步)

7.1 在 UTM 中添加共享目录

目标:将宿主机上的某个目录(例如 ~/ctf)映射为虚拟机中的 /mnt/shared

  1. 在虚拟机内执行 sudo poweroff 关机;
  2. 在 UTM 主界面选中该虚拟机,点击 Edit
  3. 找到 Sharing / Directory Sharing 相关设置;
  4. 新增一条共享目录:
    • Name:shared(名称可自定义,但需与挂载命令保持一致);
    • Directory:宿主机上的目录路径(如 /Users/<username>/ctf);
    • 权限:Read & Write。

保存后重新启动虚拟机。

7.2 在 Ubuntu 中挂载共享目录

登录虚拟机后,创建挂载点:

sudo mkdir -p /mnt/shared

尝试使用 virtiofs 挂载:

sudo mount -t virtiofs shared /mnt/shared

若无报错,在 /mnt/shared 下即可看到宿主机目录中的文件。

如遇不支持 virtiofs 的情况,可根据实际 UTM 版本选择 9p 等其他挂载方式,这里不展开。

7.3 开机自动挂载(可选)

为了避免每次手动执行 mount,可以在 /etc/fstab 中添加一条记录:

sudo vim /etc/fstab

在文件末尾添加:

shared  /mnt/shared  virtiofs  defaults  0  0

保存后执行:

sudo mount -a

无报错则说明配置生效。以后每次开机时会自动挂载共享目录。


8. Pwn 工具链部署

本节将安装日常 Pwn 题常用的工具,包括 Python3 + pwntools、gdb + pwndbg、patchelf、one_gadget 等。

8.1 Python3 与 pwntools

Ubuntu 22.04 默认提供 Python3:

python3 --version

如缺少则安装:

sudo apt install -y python3 python3-pip python3-venv

安装 pwntools:

pip3 install --upgrade pip
pip3 install --user pwntools

安装完成后,可通过:

python3 -c "from pwn import *; print(context)"

简单验证。

8.2 gdb 与 pwndbg

安装 gdb:

sudo apt install -y gdb gdb-multiarch

安装 pwndbg:

cd ~
git clone https://github.com/pwndbg/pwndbg.git
cd pwndbg
./setup.sh

安装完成后,执行:

gdb ./chall

应默认加载 pwndbg,呈现其增强后的界面。

8.3 其他辅助工具

8.3.1 patchelf

用于修改 ELF 的动态链接器和依赖库:

sudo apt install -y patchelf

示例用法:

# 替换依赖的 libc.so.6
patchelf --replace-needed libc.so.6 ./libc-2.31.so ./chall

# 修改动态链接器
patchelf --set-interpreter ./ld-2.31.so ./chall

8.3.2 one_gadget

用于从指定 libc 中搜索可用的 one_gadget:

sudo gem install one_gadget

安装完成后:

one_gadget ./libc-2.31.so

即可列出候选 gadget。

8.3.3 其他常用包

部分脚本会用到的工具,可以一并安装:

sudo apt install -y zstd

在此基础上,可以根据个人习惯继续完善终端、shell、tmux 等细节,使其真正成为一台“顺手”的 Pwn 专用环境。