Mac&M1本地非docker可调试PWN环境搭建

引言

  由于最近又需要重新复习pwn,但是之前的老电脑跑起来像一台拖拉机一样所以考虑尝试在Mac上搭建一套可以完美(并不)使用的pwn环境,思路依然是虚拟机+目录共享。
  众所周知由于M1换了架构,所以x86的程序在本地根本跑不起来,参考之前大佬的的方法搭建了python2和python3两个docker环境,可以跑exp打远程,本地无法调试,显然不符合需求,优点是性能强,共享目录方便,确实是适合救急用,所以平时我会专门开一个桌面用于这两个docker pwn环境,细节可以参考大佬博客。
  https://blog.csdn.net/qq_25755011/article/details/115541221
  短暂使用过后发现还是搭一个完美(并不)的环境靠谱,于是开始了折腾之路。

注意:本方法对虚拟机性能会造成较大损失,请根据个人需求判断是否可以接受

配置

  首先放一下我的配置,M1 pro 32g内存,已更macOS 13。

  虚拟机选用UTM,ubuntu选用ubuntu20.04.1 LTS

安装虚拟机

  想要搞到完美的x86模拟环境肯定需要一台可以模拟x86指令集的虚拟机,由于pd和vm暂时都没有对软件模拟x86进行支持,所以这里我们选择安装UTM进行软件模拟虚拟机。这里直接在github下载安装即可,同时需要准备好ubuntu镜像。
https://github.com/utmapp/UTM/releases/latest/download/UTM.dmg  #UTM虚拟机
https://releases.ubuntu.com/focal/ubuntu-20.04.5-desktop-amd64.iso  #Ubuntu 20.04x86-64
  安装完成之后,打开UTM,新建虚拟机,选择模拟(我这里已经安装完一个虚拟机,可能界面不同)

  这里选择linux,继续往下走。

  这里选择启动光盘镜像,随后选择你下载的ubuntu的镜像文件,下一步。

  在这里的设置其实对虚拟机跑起来的性能影响不大,模拟出的cpu默认也不支持多核,所以默认即可,也可以把内存设置大一点、设置个4核图一个心理安慰,下一步。

  这里影响也不大,我们后期会使用本地目录共享挂载到虚拟机使用,这里的驱动器大小设置64、128看个人情况,下一步。

  在你的本机创建一个目录,然后在这里选择他,这个目录就是以后宿主机与虚拟机的文件共享的目录,具体后面会详细说明,暂时先设置,但是不会生效。

  这里起一个自己喜欢的名字即可,保存后启动虚拟机,开始正常的ubuntu安装过程。

安装完毕后,取消CD/DVD的装载后,设置网络为桥接后进入系统。

  提示:这里安装ubuntu的过程和vm安装的过程完全一样,就是非常非常非常慢,耐心等待安装即可,后面会对其进行优化

SSH连接

  UTM自带的UI界面简直不能再卡,本身模拟就很卡,基本无法操作,所以暂时先忍受卡顿安装SSH服务,用本机的远程连接操作shell会好很多

1
2
# sudo apt update
# sudo apt install openssh-server

出现提示一路回车,安装完毕后可以使用以下指令查看服务状态,该服务默认自启。

1
# sudo systemctl status openssh-server

然后查看虚拟机ip

1
2
3
# ifconfig 
# 如果报错,执行
# sudo apt-get install net-tools

查看本机ip,第一个网卡里的ip就是我们虚拟机的ip,此时可以尝试用宿主机去ping一下,应该可以ping通。

随后我们就可以用mac的终端新建远程连接到ubuntu。

配置共享文件夹

  这里我们采用WebDAV实现共享文件夹,安装SPICE、WebDAV。本节中建议所有操作先在root下进行,或者全程sudo。

1
2
# apt update
# apt install spice-vdagent spice-webdavd

  配置UTM共享选项,选择SPICE WebDAV

此时进入系统后,可以访问网络中其他位置找到共享文件夹,该文件内容与此前设置的共享路径一致,但是此时的问题是命令行无法访问到该目录,仅可通过网络访问,地址如下

1
# http://localhost:9843  #默认端口为9843,这个链接指向UTM设置的共享路径

(由于写教程时已经卸载桌面,所以没有截图)

为了实现需求,我们安装davfs2实现挂载

1
2
# sudo apt update
# sudo apt install davfs2

安装完成后,可以直接使用以下指令挂载davfs

1
2
3
# sudo mount -t davfs http://localhost:9843 <your path>
e.g.
# sudo mount -t davfs http://localhost:9843 /User/mu/mac-share

此时便可以访问挂载点,该操作可能会要求输入用户名和密码,该步骤输入什么都可以,UTM的共享本身没有身份校验,可以一路回车,也可以输入任意值,建议输入1,1


实现开机免密自动挂载

首先开启用户锁,删除use_locks前面的#并把1改为0,命令如下。

1
# sudo vim /etc/davfs2/davfs2.conf

之后,保存用户名和密码,在最下面新起一行添加

1
2
# sudo vim /etc/davfs2/secrets
# 添加 <你的WebDAV地址 1 1>

在这里由于我们没有身份验证,所以直接使用1进行占位,添加

1
# http://localhost:9843 1 1

保存退出,此时可以取消挂载,并重新挂载试一下,不需要回车了,可以直接挂载成功

1
2
# sudo umount <your path>
# sudo mount -t davfs http://localhost:9843 <your path>

随后开启开机自动挂载,添加配置信息到如下文件

1
2
# sudo vim /etc/fstab
# 添加 http://localhost:9843 <你的虚拟机内路径> davfs defaults 0 0

保存后即可实现开机自动挂载

优化

  由于我装的桌面版ubuntu,又不想直接用服务器版,两者差异比较难习惯,所以在此卸载桌面版臃肿的桌面系统,提高系统流畅度,具体流程如下:

1
# sudo vim /etc/default/grub

修改
GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash”
         ⬇️
GRUB_CMDLINE_LINUX_DEFAULT=“text”
执行

1
2
3
4
5
6
7
8
9
10
11
12
13
# sudo update-grub
# sudo systemctl set-default multi-user.target
# sudo reboot
# 重启后
# sudo apt-get remove gnome-shell
# sudo apt-get remove gnome
# sudo apt-get autoremove
# sudo apt-get purge gnome
# sudo snap remove store
# sudo snap remove gnome*
# sudo apt remove snapd
# sudo apt-get autoclean
# sudo apt-get clean

使用

  自此,你就拥有了一个X86架构的pwn环境,只需要在比赛前提前打开虚拟机,宿主机远程连接使用,赛题通过共享文件夹同步,pwn环境配置不再赘述,大佬们写了很多,可以自己选择搭配自己的环境。

后记

  就个人使用而言,我感觉虽然有些卡顿,但是足以满足日常使用,各位大佬有更好的方法也欢迎分享跟我,目前这是我能想到的一个笔记本实现pwn环境的最优解。