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):
负责代码编辑、文件管理、浏览器等“体验相关”的部分。
典型工作流为:
- 宿主机在某个目录(如
~/ctf)中整理题目和脚本; - UTM 将该目录映射为虚拟机中的
/mnt/shared; - 在虚拟机中对共享目录内的程序进行编译、运行和调试。
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 新建虚拟机
- 打开 UTM,点击左上角
+→Create New。 - 在第一步中选择 Emulate(M 系列 Mac 要模拟 x86_64 只能使用 Emulate)。
- Guest OS 选择
Linux。 - 架构(Architecture)选择
x86_64。 - 在 Boot Image 一栏,选择刚刚下载的
ubuntu-22.04.5-live-server-amd64.iso。 - 继续下一步,配置虚拟机资源。
4.2 资源与磁盘配置参考
根据实际硬件情况,可以设置为:
- 内存:
4096 MB(4G)或更高; - CPU:2~4 核;
- 磁盘:新建虚拟磁盘,容量建议在 40G 左右;
网络模式选择 Shared Network (NAT) 即可,之后可以直接从虚拟机访问外部网络。
保存配置后,启动该虚拟机,即可进入 Ubuntu Server 安装流程。
5. Ubuntu Server 安装过程
5.1 基本安装步骤概览
启动虚拟机后,按照 Ubuntu 安装器的提示依次完成:
- 语言与键盘布局
- Language:选择 English;
- Keyboard:默认
English (US)即可。
- 网络配置
- 默认 DHCP,能正常联网即可;
- 无需在此阶段做额外复杂配置。
- 镜像源与代理
- 先使用默认设置完成安装,后续在系统内部更换国内镜像源;
- 若有 HTTP 代理需求,也可在系统安装完成后统一配置。
- 磁盘分区
- 选项
Use an entire disk; - 使用之前创建的虚拟磁盘,分区策略保持默认即可。
- 选项
- 用户与主机名
- 设置方便记忆的主机名(如
pwnbox); - 创建日常使用的用户,设置密码并牢记。
- 设置方便记忆的主机名(如
- OpenSSH Server(推荐)
- 安装时勾选
Install OpenSSH server,后续可在 macOS 上直接通过 ssh 连接虚拟机。
- 安装时勾选
- 完成安装并重启
- 安装完成后,选择
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-traditional、socat:本地起服务、模拟远程环境;strace、ltrace:系统调用和库函数跟踪;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。
- 在虚拟机内执行
sudo poweroff关机; - 在 UTM 主界面选中该虚拟机,点击
Edit; - 找到
Sharing/Directory Sharing相关设置; - 新增一条共享目录:
- Name:
shared(名称可自定义,但需与挂载命令保持一致); - Directory:宿主机上的目录路径(如
/Users/<username>/ctf); - 权限:Read & Write。
- Name:
保存后重新启动虚拟机。
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 专用环境。