前言

安装软件或 git 仓库到本地时,建议在路径 /opt 下安装或存放,养成文件管理的习惯

另外,apt 安装时建议使用新的 sudo apt install xxx 代替旧的 sudo apt-get install xxx

使用 pip 安装库时,pip install xxxsudo pip install xxx 安装的库路径不一样,例如:

  • sudo pip install xxx 安装路径:/usr/local/lib/python3.10/dist-packages/
  • pip install xxx 安装路径:/home/wyy/.local/lib/python3.10/site-packages/

尽量不要使用 sudo pip install 来安装 python 库


如果搭建 Ubuntu 22.04 这种新版本的环境,请移步本站:《Ubuntu22.04虚拟机环境搭建》一文


以下所有的安装都基于 Ubuntu 16.04 (需要升级 pip 和 python)虚拟机进行了测试,因为许多地方与 Ubuntu 22.04 有所区别,所以另写了一篇专门针对 Ubuntu 16.04 的配置

不算 tips 的小 tips:

  1. VM 虚拟机挂起后再保存快照可以秒存,但开机运行状态保存快照相当慢(开机运行状态保存快照中途是可以继续操作虚拟机的,不影快照的保存)
  2. 如果发现在虚拟机中,鼠标的额外功能键无法使用,比如:前进、后退等
    在虚拟机文件夹下,有一个 xxx.vmx 的文件,在虚拟机关闭的条件下,使用记事本打开,在文件的最后添加如下内容,重新开启虚拟机,即可使用鼠标的额外功能键
    mouse.vusb.enable = "TRUE"  
    mouse.vusb.useBasicMouse = "FALSE"  
    usb.generic.allowHID = "TRUE"
  3. Ubuntu 16.04 将屏幕左侧的启动器栏移动到屏幕底部,在终端输入:
    gsettings set com.canonical.Unity.Launcher launcher-position Bottom
    
    # 如果想换回左侧,输入:
    gsettings set com.canonical.Unity.Launcher launcher-position Left
  4. 如果开机出现显示器相关报错:无法应用原保存的显示器配置或者 CRTC 63 相关问题
    rm ~/.config/monitors.xml
    重启即可解决

VMtools

像 Ubuntu16.04 这种旧版本不建议使用 Open VM Tools(会报错),还是建议使用 VMware 官方的 VMware Tools

# 安装,将VMtools解压到一个目录下,例如主目录
cd ~/vmware-tools-distrib
sudo ./vmware-install.pl

更换镜像源

Linux 自带的源来自国外,有时候下载速度感人,十分难受,建议更换系统的镜像源

针对 Ubuntu 16.04 我建议使用阿里源,因为后面 pip 源也建议使用阿里源,否则 pip 会出现 SSL 问题,这里可以将镜像源和 pip 源统一一下

cd /etc/apt # 进入apt目录下
sudo cp sources.list sources.list.backup # 备份
sudo vim sources.list # 编辑sources.list文件

# 加入下面两个----之间的内容
-----------------------------------------------------------------
# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
-----------------------------------------------------------------

 # 刷新三连
sudo apt update
sudo apt upgrade
sudo apt clean

Python 配置

注意:
如果要给 Ubuntu 16.04 安装新版本的 Python,尽量不要更改系统默认的 python3 指向,因为 Ubuntu 的一些功能依赖于 python 2.7 和 python 3.5,随意改动可能出现各种奇奇怪怪的兼容性问题

另外,系统自带的 python 千万不要卸载,可能导致系统崩溃!!!

Ubuntu 16.04 的 pip 源建议使用阿里源,否则后面使用 pip 可能会遇到 SSL 问题

Ubuntu 16.04 默认:

python ==> python 2.7
python2 ==> python 2.7
python3 ==> python 3.5

pip ==> pip (python 2.7)
pip2 ==> pip (python 2.7)
pip3 ==>

以上默认设置尽量不要更改 (python 和 pip 的指向可以修改,但 python2、python3 尽量不要动)

如果安装了新版的 Python,例如安装了 python 3.10.6,就使用 python3.10 来打开,同理使用 pip3.10

即对应关系为:

python ==> python 2.7
python2 ==> python 2.7
python3 ==> python 3.5
python3.10 ==> python 3.10

pip ==> pip (python 2.7)
pip2 ==> pip (python 2.7)
pip3 ==> 无
pip3.10 ==> pip (python 3.10)

升级系统自带 pip

由于系统自带的 python 的 pip 版本太低 (pip-8),后续操作会导致各种问题,所以最好升级一下

但是注意千万不能直接使用 pip3 install --upgrade pip 来升级系统自带的 pip

因为这会将 pip 升级为最新版,导致与 python 3.5 不匹配,因为 python 3.5 最高只支持 pip-20.3.4 (python 3.5 在 2020 年 9 月后不再支持 pip-21 以后的版本)

使用 get-pip.py 更新 python 3.5 自带的 pip 版本:

sudo wget https://bootstrap.pypa.io/pip/3.5/get-pip.py -O get-pip3.5.py
python3.5 get-pip3.5.py

同理 python 2.7:

sudo wget https://bootstrap.pypa.io/pip/2.7/get-pip.py -O get-pip2.7.py
python2.7 get-pip2.7.py

如果更新 pip 后使用 pip -V 出现警告:

WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.3.4 from /home/wyy/.local/lib/python3.5/site-packages/pip (python 3.5)

解决办法:

# 注意, PATH 的内容要与上述 WARNING 中的路径一致
echo 'export PATH=/home/wyy/.local/lib/python3.5/site-packages/pip:$PATH' >> ~/.bashrc
source ~/.bashrc

更换 pip 源

Ubuntu 16.04 的 pip 源建议使用阿里源,否则后面使用 pip 可能会遇到 SSL 问题

如果使用 pip install xxx 无法安装库,出现警告:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)': /simple/pwn/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)': /simple/pwn/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)': /simple/pwn/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)': /simple/pwn/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)': /simple/pwn/
Could not fetch URL https://pypi.tuna.tsinghua.edu.cn/simple/pwn/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.tuna.tsinghua.edu.cn', port=443): Max retries exceeded with url: /simple/pwn/ (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),)) - skipping

可尝试更换 pip 源,这通常是因为 Ubuntu 16.04 这种老版本使用清华源导致的

例如将清华源换成阿里源,更改 ~/.config/pip/pip.conf 文件内容,示例:

[global]
index-url = http://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host = mirrors.aliyun.com

安装 python 3.10.6

由于 Ubuntu 16.04 自带的 python 3.5 太老了,pip 默认版本只有 8,是无法直接安装 pwntools 的,也会存在其他的版本问题,索性直接安装一个新一点的 python 3.10.6

但是安装过程也不是一帆风顺的,遇到了各种各样的 bug,下面会具体分析和解决

如果图方便和稳定,就安装 python 3.9 及以下的版本吧,试了一次好像没什么 bug (至少没有 SSL 问题)

参考文章:
Ubuntu安装python3.10.6-CSDN博客

安装相关库:

sudo apt update
sudo apt install libffi-dev build-essential python-dev python-setuptools python-pip python-smbus build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libxpm-dev libxext-dev zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev

安装依赖:

sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

下载并解压 python 3.10.6 源码:

sudo wget https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz
tar -vxf Python-3.10.6.tgz

编译安装:

cd Python-3.10.6

# --prefix 指定安装的目录,我这里安装在 /usr/local/python3.10.6 下
# --enable-optimizations 对编译结果进行优化,提高运行效率
sudo ./configure --prefix=/usr/local/python3.10.6 --enable-optimizations

sudo make

sudo make altinstall

这里安装使用的是 sudo make altinstall 而不是 sudo make install (当然也可以)
使用 sudo make install 可能会更改自带的 python3 安装,使卸载变得困难,甚至使自带的 python3 变得不可用,但一般不会出现这些恶性错误


踩坑与解决

参考文章:

  1. python3的安装(踩坑版,解决ssl问题,解决pip3无法使用的问题)python3 安装ssl模块-CSDN博客
  2. python3.10编译安装报SSL失败解决方法_python源码编译的时候 — logging error — got an error: -CSDN博客
  3. The necessary bits to build these optional modules were not found: _uuid _bz2 _curse _curses_panel-CSDN博客

安装 python 3.10.6 在 make 编译的最后会报错:

The necessary bits to build these optional modules were not found:  
_lzma                 _uuid                                      
To find the necessary bits, look in setup.py in detect_modules() for the module's name.  
  
  
The following modules found by detect_modules() in setup.py, have been  
built by the Makefile instead, as configured by the Setup files:  
_abc                  pwd                   time                 
  
  
Failed to build these modules:  
_hashlib              _ssl                                       
  
  
Could not build the ssl module!  
Python requires a OpenSSL 1.1.1 or newer

原因在于 python 3.10 依赖的 OpenSSL 必须要是 1.1.1 之后的版本,或者安装了 2.6.4 之后的 libressl,linux 自带的 OpenSSL 版本过低,同时还显示缺少 _lzma_uuid


编译安装 OpenSSL 1.1.1n

下载:https://www.openssl.org/source/openssl-1.1.1n.tar.gz

解压并编译:

sudo wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
tar -zxvf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n

sudo ./config --prefix=/usr/local/openssl
sudo make
sudo make install

修改链接文件:

# 备份原有链接
sudo mv /usr/bin/openssl /usr/bin/openssl.bak
 
# 创建软链接
sudo ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl

添加路径至 ld.so.conf: (注意路径最后不能带 '/',否则会报错)

sudo su   # 先进入 root 账户,否则下面一条语句会报权限问题的错误
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf

查看设置是否生效:

ldconfig -v

查看 OpenSSL 版本:

openssl version

# 输出:
OpenSSL 1.1.1n  15 Mar 2022

修改 python 3.10.6 编译源文件的 Setup 中的链接,路径位于:Python-3.10.6/Modules/Setup

Setup 中找到如下位置,可直接搜索 'OPENSSL' (大概位于第 211 行):

# Socket module helper for SSL support; you must comment out the other
# socket line above, and edit the OPENSSL variable:
 OPENSSL=/usr/local/openssl
 _ssl _ssl.c \
     -I$(OPENSSL)/include -L$(OPENSSL)/lib \
     -lssl -lcrypto
#_hashlib _hashopenssl.c \
#     -I$(OPENSSL)/include -L$(OPENSSL)/lib \
#     -lcrypto

将中间这四句取消注释,并将 OpenSSL 的安装路径填入 OPENSSL= 后面 (其他地方都不需要改动,可能 Setup 的内容有些区别,以自己的为主)

保存 Setup 文件


安装 _lzma_uuid

直接一次性安装全部:

sudo apt install uuid-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev sqlite3 libsqlite3-dev openssl libssl-dev tcl8.6-dev tk8.6-dev libreadline-dev zlib1g-dev libffi-dev

再次编译安装 python

最后,重新编译安装 python 3.10.6:

cd Python-3.10.6

# --prefix 指定安装的目录,我这里安装在 /usr/local/python3.10.6 下
# --enable-optimizations 对编译结果进行优化,提高运行效率
sudo ./configure --prefix=/usr/local/python3.10.6 --enable-optimizations

sudo make

sudo make altinstall

此时 make 编译最后显示:

The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  _ssl                  pwd                
time                                                           


Failed to build these modules:
_hashlib  

_hashlib 是 OpenSSL 用于支持哈希加密的模块之一,由于我们手动编译安装了 OpenSSL 1.1.1n,忽略即可

安装完后,终端输入 python3.10 即可打开 python3.10.6 的界面

pip3 也会自动安装好:

Linux虚拟机CTF环境搭建8.png

如果出现:

WARNING: The script pip3.10 is installed in '/usr/local/python3.10.6/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

解决办法:

# 注意, PATH 的内容要与上述 WARNING 中的路径一致
echo 'export PATH=/usr/local/python3.10.6/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

验证安装:

Linux虚拟机CTF环境搭建9.png

查看安装路径:

Linux虚拟机CTF环境搭建13.png

防止后续安装 Pwntools 时发生报错,还需要在 /usr/local/python3.10.6(以自己实际安装路径为主)下建立一个 pip 的软连接:

sudo ln -s /usr/local/python3.10.6/bin/pip3.10 /usr/local/python3.10.6/bin/pip

同时,此时 python3.10pip3.10 是不可以在 sudo 下运行的,加入软链接:

sudo ln -s /usr/local/python3.10.6/bin/python3.10 /usr/bin/python3.10
sudo ln -s /usr/local/python3.10.6/bin/pip3.10 /usr/bin/pip3.10

到此,大功告成!完美!


设置默认 python 和 pip 版本

设置默认 python 版本为 python 3.10.6,默认 pip 版本为 pip-22.2.1 (python 3.10.6)

  1. 通过修改软连接:
# 删除原有的软链接
sudo rm /usr/bin/python
sudo rm /usr/bin/pip

# 设置软连接
sudo ln -s /usr/local/python3.10.6/bin/python3.10 /usr/bin/python
sudo ln -s /usr/local/python3.10.6/bin/pip3.10 /usr/bin/pip
  1. 通过更改 .bashrc
echo alias python=python3.10 >> ~/.bashrc
echo alias pip=pip3.10 >> ~/.bashrc
source ~/.bashrc

提示:
尽量不要更改 python3 的默认版本,python3 默认指向 python 3.5,因为 Ubuntu 16.04 某些设置可能会用到 python 3.5,更改可能会出现各种奇奇怪怪的问题

注意:/usr/local/python3.10.6 这个地址是安装后 python 3.10.6 的路径,视自己的情况而定

python 3.10.6 的路径可以通过 which python3.10 来查看


安装 python 3.9 及以下版本

以 python 3.9.13 为例,这个版本就没有 python 3.10 那么麻烦了

安装相关库:

sudo apt update
sudo apt install libffi-dev build-essential python-dev python-setuptools python-pip python-smbus build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libxpm-dev libxext-dev zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev

安装依赖:

sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
sudo apt install uuid-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev sqlite3 libsqlite3-dev openssl libssl-dev tcl8.6-dev tk8.6-dev libreadline-dev zlib1g-dev libffi-dev

下载:Python Release Python 3.9.13 | Python.org

解压并编译安装:

tar -zxvf Python-3.9.13.tgz
cd Python-3.9.13

# --prefix 指定安装的目录,我这里安装在 /usr/local/python3.9 下
# --with-pydebug 添加调试工具
# --enable-optimizations 对编译结果进行优化,提高运行效率
sudo ./configure --prefix=/usr/local/python3.9 --with-pydebug --enable-optimizations

sudo make

sudo make altinstall

配置 python 3.9.13 和 pip 3.9:

$ sudo ln -s /usr/local/python3.9/bin/python3.9  /usr/bin/python3.9
$ sudo ln -s /usr/local/python3.9/bin/pip3.9  /usr/bin/pip3.9

如果出现:

The directory '/home/wyy/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/wyy/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

解决办法:

# 注意修改为自己的用户名
sudo chown -R root /home/wyy/.cache/pip/
sudo chown -R root /home/wyy/.cache/pip/http/

管理多个版本的 Python

使用 update-alternatives 来切换终端中 python 指令所对应的 python 版本

示例:

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 2
sudo update-alternatives --install /usr/bin/python python /usr/local/python3.9/bin/python3.9 3

最后数字为对应 python 版本优先级,数值越大,优先级越高

快速切换 python 版本:

sudo update-alternatives --config python

输出:

3 个候选项可用于替换 python (提供 /usr/bin/python)。

  选择       路径                              优先级  状态
------------------------------------------------------------
* 0            /usr/local/python3.9/bin/python3.9   3         自动模式
  1            /usr/bin/python2.7                   1         手动模式
  2            /usr/bin/python3.5                   2         手动模式
  3            /usr/local/python3.9/bin/python3.9   3         手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:

选择需要切换的 python 版本即可


Java 配置

open-jdkoracle-jdk 选其一即可,oracle-jdk 相对来说更稳定一点

安装 open-jdk

查找 open-jdk 版本:

sudo apt search openjdk

以安装 open-jdk 8 为例:

sudo apt install openjdk-8-jdk

# 验证
java -version

查看已安装的 open-jdk 版本:

apt list --installed | grep openjdk

# 显示:
# openjdk-11-jdk-headless/jammy-updates,jammy-security,now 11.0.20.1+1-0ubuntu1~22.04 amd64 [已安装,自动]
# openjdk-11-jdk/jammy-updates,jammy-security,now 11.0.20.1+1-0ubuntu1~22.04 amd64 [已安装]
# openjdk-11-jre-headless/jammy-updates,jammy-security,now 11.0.20.1+1-0ubuntu1~22.04 amd64 [已安装,自动]
# openjdk-11-jre/jammy-updates,jammy-security,now 11.0.20.1+1-0ubuntu1~22.04 amd64 [已安装,自动]

卸载 open-jdk,以 open-jdk 11 为例:

sudo apt --purge remove openjdk-11-jdk
sudo apt --purge remove openjdk-11-jdk-headless
sudo apt --purge remove openjdk-11-jre
sudo apt --purge remove openjdk-11-jre-headless

可以同时使用 apt 安装多个版本的 open-jdk,然后使用如下命令切换 jdk 版本:

# 如果我们只用 apt 安装过一个版本的 java,会显示无需配置
sudo update-alternatives --config java

安装 oracle-jdk

官网下载 jdk 压缩包:Java Downloads | Oracle

以 oracle-jdk 8 为例,下载 jdk-8u381-linux-x64.tar.gz

解压并移动到 /usr/bin 目录下:

tar vxf jdk-8u381-linux-x64.tar.gz
sudo mv jdk1.8.0_381 java && sudo mv java /usr/bin/

配置环境变量:

export JAVA_HOME=/usr/bin/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 验证
java -version

卸载只需删除 /usr/bin/java 目录即可


CTF 配置

回归正题,可以开始安装 CTF 所需要的环境了

安装 git

迟早要用到的

sudo apt install git
  • 如果发现有时候网不行,github 项目 git 不下来或者 wget 不下来,无法连接,尝试 cdn 加速:
git config --global url."https://ghproxy.com/https://github.com".insteadOf "https://github.com"

如果不想使用了,通过:

git config --global --edit

删除掉对应的配置即可

注意:官方是没有提供 cdn 的,因此上面的 cdn 链接都是用爱发电,可能某天就无法使用了

  • 也可以对 github.com 添加代理:
git config --global http.https://github.com.proxy socks5://127.0.0.1:7890

如果不想使用了,通过:

git config --global --unset http.https://github.com.proxy

取消代理即可


安装 32 位库

运行 32 位的 ELF 可执行文件时需要

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libncurses5-dev lib32z1
sudo apt install libc6:i386 libstdc++6:i386

安装 Capstone

一个轻量级的多平台架构支持的反汇编架构

sudo git clone https://github.com/aquynh/capstone /opt/capstone
cd /opt/capstone
sudo make
sudo make install

安装 pwntools

通过 pip 安装或通过 git 安装,两种方法都可以,选其一即可

  • 通过 python 的 pip 安装

需要注意使用哪个版本的 python 的 pip 来安装

如果安装了新版的 python,例如 python 3.10.6,那就需要将 python 修改为默认指向 python 3.10.6,因为 Ubuntu 16.04 中 python 默认指向 python 2.7

sudo python -m pip install pwntools

# 或者直接安装pwn库,自带pwntools
sudo python -m pip install pwn

或者直接:

pip3.10 install pwntools

# 或者直接安装pwn库,自带pwntools
pip3.10 install pwn

注意:
如果坚持使用系统自带的 python 3.5 来安装 pwntools 的话

因为 pip 默认版本只有 8,是无法直接安装 pwntools 的,报错
直接使用 pip3 install --upgrade pip 更新 pip 的话,会将 pip 更新到最新版,导致与 python 3.5 不匹配,报错

解决方法:
首先下载 python 3.5 的 get-pip.py 并进行 pip 更新
如果 wget 下载太慢,建议直接访问 https://bootstrap.pypa.io/pip/3.5/ 用科学上网进行下载
在进行 python3.5 get-pip.py 之前,请先更换 pip 源,否则会很痛苦

wget https://bootstrap.pypa.io/pip/3.5/get-pip.py  
python3.5 get-pip.py

这样会安装好 python 3.5 所支持的最新版 pip:pip-20.3.4

但在通过 pip 安装 pwntools 时,可能会报错:ERROR: Failed building wheel for cffi

解决办法:
先安装 cffi 所需要的依赖:sudo apt install libffi-dev
然后即可正常安装:pip3 install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple

建议还是直接安装 python 3.10 使用

  • 通过 git 安装
sudo git clone https://github.com/Gallopsled/pwntools /opt/pwntools
cd /opt/pwntools
sudo python setup.py install

因为我没用这种方法,如果报错的话,请参照 GDB 配置一节中安装 pwndbg 的方法,去 Gallopsled/pwntools: CTF framework and exploit development library (github.com) 手动下载一个旧版本的 pwntools,然后编译安装

  • 验证安装
python # 打开python

# 输入下面的代码,Ⅰ或Ⅱ选其一即可
-------------------------------------------
# Ⅰ
import pwn
pwn.asm("xor eax,eax")
-------------------------------------------
# Ⅱ
from pwn import *
asm("xor eax,eax")
-------------------------------------------
# 如果输出的是这个,那就是安装成功了
输出:'1\xc0'
-------------------------------------------

安装 LibcSearcher

在做栈溢出相关的题时,经常会遇到构造 ROP 链的情况。若我们在 IDA 反编译之后没有看到 system 函数,栈题大概率需要泄漏 libc 库中的函数。此时,LibcSearcher 就是最好的选择,可以用它找到偏移地址

需要注意使用哪个版本的 python 的 pip 来安装

如果安装了新版的 python,例如 python 3.10.6,那就需要将 python 修改为默认指向 python 3.10.6,因为 Ubuntu 16.04 中 python 默认指向 python 2.7

pip install LibcSearcher -i http://mirrors.aliyun.com/pypi/simple/

Ubuntu 16.04 的 pip 使用清华源可能会出现 SSL 错误,建议使用阿里源:http://mirrors.aliyun.com/pypi/simple/

注意
网上有很多通过 git 来安装的 LibcSearcher 在使用的时候会出现 “libcsearcher No matched libc, please add more libc or try others“ 的报错,通过 git 安装的那个版本可能不支持 python3,或者不是云端查找

我自己当初就是通过 git 安装,然后踩坑了,网上一大堆说删了 Libcdatabase 重新下载、通过 ./get 更新的方法,但都行不通。。。


安装 checksec

checksec 可用于识别二进制文件的安全属性,只是一个 sh 脚本,安装 pwntools 时自带,如果没有或者出现问题的话可以再手动安装

sudo git clone https://github.com/slimm609/checksec.sh.git /opt/checksec.sh
cd /opt/checksec.sh

# 直接创建软链接即可使用,
sudo ln -s /opt/checksec.sh/checksec /usr/local/bin/checksec

注意:创建软连接的指令中,两个路径都必须使用绝对路径,否则会报如下错误:

符号连接的层数过多: checksec

如果使用 checksec 过程中出现如下报错:

command not found: checksec

可尝试使用上述方法通过 git 仓库创建软链接进行修复

当然还可以直接重装 pwntools,因为 checksec 一般是安装 pwntools 自带的,报错大概率与 pwntools 有关:

pip uninstall pwntools
pip install pwntools

安装 ROPgadget

用来找 gadget 的,这个安装 pwntools 时自带,如果没有的话可以再手动安装

sudo git clone https://github.com/JonathanSalwan/ROPgadget.git /opt/ROPgadget
cd /opt/ROPgadget
sudo python setup.py install

如果使用 ROPgadget 过程中出现如下报错:

Traceback (most recent call last):
  File "/usr/local/bin/ROPgadget", line 4, in <module>
    __import__('pkg_resources').run_script('ROPGadget==7.3', 'ROPgadget')
  File "/home/wyy/.local/lib/python3.10/site-packages/pkg_resources/__init__.py", line 720, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/home/wyy/.local/lib/python3.10/site-packages/pkg_resources/__init__.py", line 1546, in run_script
    raise ResolutionError(
pkg_resources.ResolutionError: Script 'scripts/ROPgadget' not found in metadata at '/home/wyy/.local/lib/python3.10/site-packages/ROPGadget-7.3.dist-info'

无论是 pwntools 自带的 ROPgadget 还是自己手动 git 安装的 ROPgadget,都将 ROPgadget 的 git 仓库下的 scripts 目录移动到报错的路径下即可

# 如果是 pwntools 自带的 ROPgadget, 首先需要将 ROPgadget 仓库 git 到本地
# sudo git clone https://github.com/JonathanSalwan/ROPgadget.git /opt/ROPgadget

cd /opt/ROPgadget
sudo cp -r scripts /home/wyy/.local/lib/python3.10/site-packages/ROPGadget-7.3.dist-info

也可以尝试查看 ROPgadget 的版本,并卸载重装:

pip list | grep ROPgadget

pip uninstall ROPgadget
pip install ROPgadget==版本号

重装 ROPgadget 后若因为旧版本而导致 pip 产生警告:

WARNING: Skipping /usr/local/lib/python3.11/dist-packages/ROPGadget-7.2.dist-info due to invalid metadata entry 'name'

删除该文件即可:

sudo rm -rf /usr/local/lib/python3.11/dist-packages/ROPGadget-7.2.dist-info

安装 one_gadget

one_gadget 可以用来动态查找执行 libc 动态库中的 system 执行函数,可以一步到位
在做相关堆题时尤为有效,用来寻找 libc 库中的 execve('/bin/sh', NULL, NULL) ,一个 gadget 就可以 getshell,但需要注意 one_gadget 相关限制条件

注意:one_gadget 需要安装 ruby (ruby < 2.4 会导致 one_gadget 无法安装)

最好是通过添加仓库的方式安装 ruby,Ubuntu 16.04 使用 sudo apt install ruby 安装的 ruby < 2.4

通过添加仓库安装 ruby:

# 删除旧版本 ruby
sudo apt purge --auto-remove ruby

# 添加仓库
sudo add-apt-repository ppa:brightbox/ruby-ng
sudo apt update

# 指定 ruby 2.6 版本
sudo apt install ruby2.6 ruby2.6-dev

安装 one_gadget:

sudo gem install one_gadget

安装 glibc-all-in-one

在做堆题时,经常遇到不同版本的 libc,这时 glibc-all-in-one 可以很好的派上用场,动态更改 elf 文件 libc 版本

sudo git clone https://github.com/matrix1001/glibc-all-in-one.git /opt/glibc-all-in-one
cd /opt/glibc-all-in-one
./update_list   # 获取可以更新的 glibc 的版本
cat list   # 查看可下载的 glibc
./download 需要的libc版本   # 例如:2.31-0ubuntu9_amd64

默认下载到 glibc-all-in-one 的 /libs 目录下

如果运行 ./update_list 报错:

requests.exceptions.ProxyError: HTTPSConnectionPool(host='mirror.tuna.tsinghua.edu.cn', port=443): Max retries exceeded with url: /ubuntu/pool/main/g/glibc/ (Caused by ProxyError('Unable to connect to proxy', SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:997)'))))

检查 urllib3 库的版本:

pip list | grep urllib3
# urllib3            2.0.7

urllib3 库降级,即可解决:

pip uninstall urllib3
pip install urllib3==1.25.11

安装 patchelf

与 glibc-all-in-one 配合使用,可以用于更改 elf 文件 libc 版本

  • 通过 apt 安装
sudo apt install patchelf
  • 源码编译安装
sudo git clone https://github.com/NixOS/patchelf.git /opt/patchelf
cd /opt/patchelf
sudo ./bootstrap.sh
sudo ./configure
sudo make
sudo make check
sudo make install

# 验证安装:
patchelf --version

执行 sudo ./bootstrap.sh 可能会报错:

./bootstrap.sh: 2: ./bootstrap.sh: autoreconf: not found

安装所需的包:

sudo apt install autoconf automake libtool

安装 main_arena_offset

获取给定 libc 的 main_arena 偏移量

作者 zarkivy 将其集成到了 pymao 库中:GitHub - zarkivy/py_main_arena_offset: Get main_arena offset of a given libc with python (依赖于 objdump,请确保你的 Linux 中已安装 binutils 包)

  • 原版
sudo git clone https://github.com/bash-c/main_arena_offset /opt/main_arena_offset

使用方法:

cd /opt/main_arena_offset
./main_arena libc文件名
  • pymao 集成版
sudo git clone https://github.com/IZAY01/py_main_arena_offset /opt/py_main_arena_offset
cd /opt/py_main_arena_offset
sudo python3 setup.py develop

使用示例:

from pymao import *

libc = "./libc-2.27.so"
main_arena_offset = gmao(libc)
# or main_arena_offset = get_main_arena_offset(libc)

安装 QEMU

这是 arm 的 pwn 环境,QEMU 可以用来模拟各种架构的固件的运行,前期可以不安装,但是终究是逃不过的,建议一步到位

VMware 和 Virtualbox 之类通常只能在 x86 计算机上虚拟出一个 x86 虚拟机,而 QEMU 支持在 x86 上虚拟出一个 ARM 虚拟机

sudo apt install qemu qemu-kvm virt-manager bridge-utils binfmt-support
sudo apt install  qemu-system qemu-user-static   # 安装系统态、用户态

# 安装依赖库
sudo apt install -y gcc-arm-linux-gnueabi
sudo apt install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential gdb-arm-none-eabi synaptic gcc-aarch64-linux-gnu eclipse-cdt git

通过 apt 方式安装的 QEMU 卸载:

# 删除包和相关依赖
sudo apt-get remove --auto-remove qemu*
# 删除配置文件和相关的数据文件
sudo apt-get purge --auto-remove qemu*

安装 Zsteg

做 MISC 需要,图像隐写神器

sudo gem install zsteg

安装 Basecrack

做 REVERSE、MISC 需要,Base 系列编码分析工具

sudo git clone https://github.com/mufeedvh/basecrack.git /opt/basecrack
cd /opt/basecrack
pip install -r requirements.txt
python basecrack.py

升级 GDB 到 gdb-10.2

Ubuntu 16.4 自带的 GDB 版本太老(gdb-7.11.1),可以更新到 gdb-10.2

我尝试过安装 gdb-12.1 和 gdb-11.2,但是都会报错,估计与 python 3.5 有关 (使用 python 3.10.6 编译 GDB 依然报错),暂未解决,如果你喜欢折腾可以自己尝试一下,报错如下:

Ubuntu16.04虚拟机PWN环境搭建1.png

参考文章:

  1. Ubuntu16.04升级gdb7.11升级到10.2版本_ubuntu gdb升级命令-CSDN博客
  2. Ubuntu18.04升级gdb10.2_gdb10.2.tar.gz_EJoft的博客-CSDN博客

下载 GDB 源码:Index of /gnu/gdb

这里以 gdb-10.2.tar.gz 为例

编译安装:

tar -zxvf gdb-10.2.tar.gz
cd ./gdb-10.2
mkdir build && cd build

sudo ../configure --with-python=/usr/bin/python3.5 --enable-targets=all
sudo make
sudo make install

这里 --with-python=/usr/bin/python3.5 指定使用系统自带的 python 3.5 来编译 GDB

如果自己源码编译安装了新版的 Python,这里指定用新版的 Python 进行编译,编译时可能会报下列错误:

configure: WARNING: MPFR is missing or unusable; some features may be unavailable.

网上说是与 Python 的 distutilsdev 有关,源码编译的 Python 缺少相应的 python-distutilspython-dev

但是暂时还未解决该问题,所以建议直接使用系统自带的 python 3.5 来编译 GDB,较为稳定

编译过程很漫长,编译可能会报如下错误:

WARNING: 'makeinfo' is missing on your system.
         You should only need it if you modified a '.texi' file, or
         any other file indirectly affecting the aspect of the manual.
         You might want to install the Texinfo package:
         <http://www.gnu.org/software/texinfo/>
         The spurious makeinfo call might also be the consequence of
         using a buggy 'make' (AIX, DU, IRIX), in which case you might
         want to install GNU make:
         <http://www.gnu.org/software/make/>
make[5]: *** [gdb.info] Error 127

安装 texinfo 即可:

sudo apt install texinfo

接下来,替换老版本 GDB

编译生成的新版 gdb 二进制文件一般位于编译目录 gdb-10.2/build/gdb/gdb,如果不在该目录下,可以使用指令查找:sudo find / -name gdb

将 gdb 二进制文件拷贝到 /usr/bin/ 下,替换原来的旧版 gdb,也可以先将原来的旧版 gdb 做个备份,以防出问题:

sudo mv /usr/local/bin/gdb /usr/local/bin/gdb-7.11.1.backup

# 以自己编译的新版 gdb 实际路径为主
sudo cp ~/下载/gdb-10.2/build/gdb/gdb /usr/local/bin/

运行 GDB,升级完成:

Ubuntu16.04虚拟机PWN环境搭建6.png


GDB 配置

见 《GDB的基础和使用》一文,有非常详细的介绍

但是需要注意,Ubuntu 16.04 由于版本太老,无法直接安装最新版 pwndbggef,要自己通过旧版本安装

Ubuntu 16.04 安装 GDB 插件请以本文为主设置脚本自动切换 GDB 插件可以参照《GDB的基础和使用》一文

安装 peda

最新版安装方法:

sudo git clone https://github.com/longld/peda.git /opt/gdb_plugins/peda
sudo echo "source /opt/gdb_plugins/peda/peda.py" >> ~/.gdbinit

在 Ubuntu 16.04 中使用上述方法安装,暂时没有出现问题

Ubuntu16.04虚拟机PWN环境搭建9.png


安装 pwndbg

pwndbgPwngdb 需要一起搭配使用

最新版安装方法:

sudo git clone https://github.com/pwndbg/pwndbg /opt/gdb_plugins/pwndbg
cd /opt/gdb_plugins/pwndbg
sudo ./setup.sh

如果在 Ubuntu 16.04 这样的老版本中使用上述方法,安装过程中会报错
因为 python 版本太低不支持新的语法,无法安装最新的 pwndbg (pwndbg 会检测 GDB 所使用的 python 版本,与 GDB 的 python 保持一致,默认是 python 3.5)

报错信息如下:

File "/usr/local/lib/python3.5/dist-packages/pip/_internal/cli/main.py", line 57  
sys.stderr.write(f"ERROR: {exc}")  
^  
SyntaxError: invalid syntax

Ubuntu16.04虚拟机PWN环境搭建2.png

Ubuntu 16.04 需要在 https://github.com/pwndbg/pwndbg 中下载旧版本的源码

比如 2021 版的 pwndbg 就可以正常使用:pwndbg/pwndbg at 2021.06.22 (github.com) (实测 pwndbg-2022.01.05 版也可以)

然后解压移动到 /opt/gdb_plugins/ 目录下,在 /opt/gdb_plugins/pwndbg-2021.06.22 目录下使用:

sudo ./setup.sh

安装过程中会报错:

+ git submodule update --init --recursive
fatal: Not a git repository (or any of the parent directories): .git

在当前目录下初始化 git 再重新安装即可:

git init

安装 Pwngdb

安装方法:

sudo git clone https://github.com/scwuaptx/Pwngdb.git /opt/gdb_plugins/Pwngdb
cd /opt/gdb_plugins/Pwngdb
sudo cp .gdbinit ~/
sudo vim ~/.gdbinit

~/.gdbinit 的第二行插入:(记得插入在 source /opt/gdb_plugins/Pwngdb/pwngdb.py 这一句的前面)

source /opt/gdb_plugins/pwndbg-2021.06.22/gdbinit.py

如果 pwndbg 的路径不是 /opt/gdb_plugins/pwndbg-2021.06.22,请按照自己的实际路径修改

Ubuntu16.04虚拟机PWN环境搭建8.png


配置 pwndbg 分屏调试

由于 pwndbg 输出的信息较多,经常在一页上看不全,需要上下翻找,眼花缭乱

我们可以设置 pwndbg 分屏调试,一边屏幕输入命令,一边屏幕查看输出信息,提高效率

方法一:修改 gdbinit

配置很简单,先后打开两个终端

假设先打开的一个终端用于开启 gdb 调试并输入调试命令,后打开的一个终端用于输出调试信息

在两个终端分别输入 tty,先打开的终端为 /dev/pts/19,后打开的为 /dev/pts/20 (以自己的实际输出信息为主)

GDB的基础和使用2.png

修改 ~/.gdbinit 中的内容:

sudo gedit ~/.gdbinit

~/.gdbinit 末尾加入一句:

set context-output xxx

# 这里的 xxx 就是用于输出调试信息的分屏,我这里是:/dev/pts/20

注意:如果你开了多个终端,就设置为实际想要用于输出调试信息的分屏

保存退出

在先打开的终端中开启 gdb 并输入调试命令,在后打开的终端中即可输出调试信息

GDB的基础和使用3.png

然后我们将屏幕调整一下:

GDB的基础和使用4.png

设置分屏后,如果只开启一个终端,使用 gdb 可能会遇到如下报错:

Exception occurred: context: [Errno 13] 权限不够: '/dev/pts/20' (<class 'PermissionError'>)  
For more info invoke `set exception-verbose on` and rerun the command  
or debug it by yourself with `set exception-debugger on`

再开启一个终端即可解决 (新开启的终端需为 /dev/pts/20)


方法二:gdb 临时设置

由于有时候新开启的终端并不是我们在 ~/.gdbinit 中设置的那个终端,频繁更改 ~/.gdbinit 中的内容未免太过麻烦

所以,我们也可以不在 ~/.gdbinit 中设置,而是先在一个终端中启动 gdb 调试,然后再另开一个新的终端,使用 tty 查看新的终端的分屏信息:

tty

# 假设输出为:/dev/pts/18

然后在 gdb 中直接设置输出调试信息的分屏: (以自己上一步实际的分屏信息为主)

(gdb) set context-output /dev/pts/18

这样就可以避免新打开的终端与我们在 ~/.gdbinit 中设置的终端不一致的问题


安装 gef

最新版安装方法:

sudo git clone https://github.com/hugsy/gef /opt/gdb_plugins/gef
sudo echo "source /opt/gdb_plugins/gef/gef.py" >> ~/.gdbinit

如果在 Ubuntu 16.04 这样的老版本中使用上述方法,打开 gdb 会报错

与 pwndbg 一样,是因为 python 版本太低不支持新的语法,无法安装最新的 gef

Ubuntu 16.04 需要在 https://github.com/hugsy/gef 中下载旧版本的源码

比如 2021 版的 gef 就可以正常使用:Release 2021.10 - Royal Kill · hugsy/gef (github.com)

然后解压移动到 /opt/gdb_plugins/ 目录下,在 /opt/gdb_plugins/gef-2021.10 目录下使用:

sudo echo "source /opt/gdb_plugins/gef-2021.10/gef.py" >> ~/.gdbinit

打开 gdb 后如果 gef 显示:

[*] 3 command could not be loaded, run `gef missing` to know why.

输入 gef missing 查看缺失的库

[*] Command `set-permission` is missing, reason  →  Missing `keystone-engine` package, install with: `pip install keystone-engine`.
[*] Command `ropper` is missing, reason  →  Missing `ropper` package for Python, install with: `pip install ropper`.
[*] Command `assemble` is missing, reason  →  Missing `keystone-engine` package for Python, install with: `pip install keystone-engine`.

使用 pip 安装对应的库即可

注意要用 GDB 所使用的 python 版本对应的 pip 来安装,Ubuntu 16.04 的 GDB 默认使用 python 3.5

Ubuntu16.04虚拟机PWN环境搭建7.png


验证安装

  • 自用的 ~/.gdbinit 文件内容示例:
# source /opt/gdb_plugins/peda/peda.py

source /opt/gdb_plugins/pwndbg-2021.06.22/gdbinit.py

# source /opt/gdb_plugins/gef-2021.10/gef.py

source /opt/gdb_plugins/Pwngdb/pwngdb.py
source /opt/gdb_plugins/Pwngdb/angelheap/gdbinit.py

define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end

终端输入 gdb

  1. 当启用 peda 时,会出现:gdb-peda$
  2. 当启用 pwndbg 时,会出现:pwndbg>
  3. 当启用 gef 时,会出现:gef➤

如果验证出现上述输出内容,并且在输出内容之前没有任何报错提示,则说明安装成功

如果没有安装成功,输入 gdb 会显示默认的:(gdb)

另外,可以设置脚本自动切换不同的 GDB 插件使用,省去手动注释 ~/.gdbinit 文件的麻烦,具体方法请移步《GDB的基础和使用》


配置 ZSH 终端

对比 Ubuntu 和 Kali 之后,觉得 Kali 的终端历史命令自动补全的功能真的是太好用了,还有命令输入正确和错误的高亮提示,简直不要太好用,原因就在于 Kali 2020 之后的版本默认终端为 zsh

Ubuntu 也可以安装 zsh 作为终端哦,不用再羡慕隔壁 Kali 啦,接下来用 zsh 打造一个究极好用的全新 Ubuntu 终端吧

参考文章:

  1. Ubuntu版本安装zsh、配置ohmyzsh及插件、主题更换_ubuntu ohmyzsh-CSDN博客
  2. 解决oh-my-zsh plugin ‘zsh-autosuggestions’ not found 与 plugin ‘zsh-syntax-highlighting’ not found问题 | BaKanTu union us (bktus.com)

注意:安装 zsh 后,以后所有要写入 ~/.bashrc 的配置全都只需要写入 ~/.zshrc 即可

安装 zsh

sudo apt update && sudo apt upgrade
sudo apt install zsh

为了配置 zsh,还必须安装 zsh 的配置工具 oh my zsh,安装:

sudo git clone https://github.com/robbyrussell/oh-my-zsh /opt/oh-my-zsh
cd /opt/oh-my-zsh/tools
sh install.sh

输入 y 将默认 shell 更改为 zsh

Looking for an existing zsh config...
Found /root/.zshrc. Backing up to /root/.zshrc.pre-oh-my-zsh
Using the Oh My Zsh template file and adding it to /root/.zshrc.

Time to change your default shell to zsh:
Do you want to change your default shell to zsh? [Y/n]

Ubuntu16.04虚拟机PWN环境搭建10.png

验证安装:

zsh --version

# zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

添加原来 bash 的环境变量,将 ~/.zshrc 的第二行取消注释:

Linux虚拟机CTF环境搭建25.png

使配置生效:

source ~/.zshrc

一些可能的问题:

  1. 如果使用 zsh 过程中历史记录出现问题,报错如下:
zsh: corrupt history file /home/wyy/.zsh_history

删除原历史记录并重建:

mv ~/.zsh_history ~/.zsh_history_bad
strings -eS ~/.zsh_history_bad > ~/.zsh_history && fc -R ~/.zsh_history
sudo rm -rf ~/.zsh_history_bad

重启终端即可解决

  1. 如果出现以下报错:
zsh: no matches found: xxx

编辑 ~/.zshrc 文件:

sudo gedit ~/.zshrc

在文件最后加上一句:setopt no_nomatch

使配置生效:

source ~/.zshrc

配置 zsh-autosuggestions

这是一个历史命令智能提示插件,能帮助我们快速执行历史命令,实现终端历史命令自动补全

通过 git 安装:

cd /opt/oh-my-zsh/plugins
sudo git clone https://github.com/zsh-users/zsh-autosuggestions.git

打开 zsh 配置文件:

sudo gedit ~/.zshrc

搜索 plugins,在 plugins 后面添加插件 zsh-autosuggestions (注意与原有的 git 空格隔开)

并加入插件 zsh-autosuggestions 的默认保存地址:

plugins=(git zsh-autosuggestions)

source /opt/oh-my-zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

Ubuntu16.04虚拟机PWN环境搭建11.png

保存退出后,更新 ~/.zshrc 使配置生效:

source ~/.zshrc

如果报错:

➜  ~ source ~/.zshrc
[oh-my-zsh] plugin 'zsh-autosuggestions' not found

这是因为前面并没有把插件的代码仓库克隆到本地位置上,所以插件其实并没有被安装

将插件克隆到本地:

sudo git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions

更新 ~/.zshrc 使配置生效:

source ~/.zshrc

问题即可解决

安装 zsh-autosuggestions 前:

Linux虚拟机CTF环境搭建18.png

安装 zsh-autosuggestions 后:

Linux虚拟机CTF环境搭建20.png

灰色部分就是终端历史命令自动补全,与 Kali 终端一样


配置 zsh-syntax-highlighting

语法高亮插件,当在终端输入命令时,这个插件可以帮助纠错,命令为红色代表错误,绿色代表正确

方法和配置 zsh-autosuggestions 一样

通过 git 安装:

cd /opt/oh-my-zsh/plugins
sudo git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

打开 zsh 配置文件:

sudo gedit ~/.zshrc

搜索 plugins,在 plugins 后面添加插件 zsh-syntax-highlighting (空格隔开)

并加入插件 zsh-syntax-highlighting 的默认保存地址:

plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

source /opt/oh-my-zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Ubuntu16.04虚拟机PWN环境搭建12.png

将插件克隆到本地:

sudo git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting

更新 ~/.zshrc 使配置生效:

source ~/.zshrc

安装 zsh-syntax-highlighting 后:

Linux虚拟机CTF环境搭建22.png

命令为绿色代表正确,红色代表输入错误


更换 ZSH 终端主题

zsh 终端自带很多不同风格的主题,可以根据自己的喜好更换

查看 zsh 自带的主题:

cd ~/.oh-my-zsh/themes && ls

Linux虚拟机CTF环境搭建24.png

打开 zsh 配置文件:

sudo gedit ~/.zshrc

搜索 ZSH_THEME

Linux虚拟机CTF环境搭建23.png

默认主题是 robbyrussell,可以根据个人喜好自行修改

如果设置为:ZSH_THEME="random",则每次打开终端时,主题都是随机的

如果不知道选哪个主题好,也可以先将主题设置为随机,然后每次打开 zsh 后都会显示:
[oh-my-zsh] Random theme 'xxx' loaded
其中 xxx 就是该主题的名字,遇到喜欢的,就将其加到 ZSH_THEME

修改好后,更新 ~/.zshrc 使配置生效:

source ~/.zshrc

以下主题样式可供参考:

  1. af-magic

ZSH终端主题1.png

  1. bira

ZSH终端主题2.png

  1. fox

ZSH终端主题3.png

  1. xiong-chiamiov

ZSH终端主题4.png

  1. gianu

ZSH终端主题5.png

更多主题请查看:Themes · ohmyzsh/ohmyzsh Wiki (github.com)


切换 shell 终端

查看系统已安装的 shell:

cat /etc/shells

查看当前使用的 shell:

echo $SHELL
  1. 临时切换 shell:

直接输入 shell 的名称即可,切换 zsh 就终端输入 zsh,切换 bash 就终端输入 bash

  1. 永久切换 shell:
# 将终端永久切换为 zsh
sudo chsh -s /bin/zsh

编辑器和 IDE

安装 Pycharm/CLion

Ubuntu 16.04 的应用商店没有 Pycharm 和 CLion,只能自己通过安装包安装

官网下载 Linux 版:Download PyCharm: Python IDE for Professional Developers by JetBrains

pycharm-community-2021.3.3.tar.gz 为例(专业版同理)

解压并移动到 /opt 下:

sudo tar -zxvf pycharm-community-2021.3.3.tar.gz
sudo mv pycharm-community-2021.3.3 /opt/

解压后进入 Pycharm 的 bin 目录,运行 Pycharm:

cd /opt/pycharm-community-2021.3.3/bin
sudo ./pycharm.sh

运行软件后:工具栏 –> Tools –> Create Desktop Entery 可以创建桌面快捷方式,并将图标加入开始菜单

如果不想用了,可以参照官方卸载方法:卸载 PyCharm | PyCharm 文档 (jetbrains.com)

打开 Pycharm 后,如果界面显示异常,比如各种按键的方框显示不全:

Linux虚拟机CTF环境搭建5.png

一般虚拟机中的各种显示问题 bug,都和 VM 的 3D 图形加速有关,关掉即可正常显示:

Linux虚拟机CTF环境搭建6.png

Linux虚拟机CTF环境搭建7.png


安装 VScode

Ubuntu 16.04 的应用商店没有 VScode,只能自己通过安装包安装

下载软件包:Microsoft VScode

安装,以 code_1.74.2-1671533413_amd64.deb 为例:

sudo dpkg -i code_1.74.2-1671533413_amd64.deb

安装好后,如果 Ubuntu 16.04 设置了代理,在 VScode 中扩展会无法访问:XHR failed

Ubuntu16.04虚拟机PWN环境搭建3.png

其实是整个 VScode 都无法连接网络,也无法登录账户同步

解决办法:

在 VScode 的设置中搜索 proxy (代理),找到 Http:Proxy 这一项

Http:Proxy 中填入 HTTP 代理的 IP 地址和端口号:

Ubuntu16.04虚拟机PWN环境搭建5.png

Ubuntu16.04虚拟机PWN环境搭建4.png

刷新一下扩展,扩展访问正常

如果不使用代理,则同时关闭 Ubuntu 和 VScode 的代理设置


配置 C/C++

首先要安装好 gccg++gdb 环境

安装 C/C++Code Runner 插件

使用 VScode 调试:
新建 .vscode 文件夹,在 .vscode 文件夹下新建两个文件:launch.jsontasks.json

以后在其他的文件夹中要调试都要重建 .vscode 子文件夹并配置

  • launch.json 内容:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C/C++",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "preLaunchTask": "compile",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
  • tasks.json 内容:
{
    "version": "2.0.0",
    "tasks": [{
            "label": "compile",
            "command": "g++",   // c 文件为 gcc, cpp 文件为 g++
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

配置 Python

首先要安装好 python 环境

安装插件 Code Runner 即可,其他插件:PylancePython

Code Runner 插件的代码运行指令可在 扩展 -> Code Runner -> 扩展设置 -> Code-runner: Executor Map -> 在 settings.json 中编辑 进行自定义


使用和一些问题

如果是从 snap 商店安装的 VScode 可以直接使用,如果是自己通过 .deb 包安装,可能需要将 code 添加到环境变量

从终端打开 VScode:

code

使用 VScode 创建文件并编辑: (类似于 VIM)

code 文件名

注意:
在 VScode 中使用绝对路径一般没问题,但是使用相对路径 ./ 可能会出问题
这并不是路径错了,而是 VScode 默认的相对路径是针对 .vscode 文件夹所在的目录,而不是当前编辑的文件所在目录
.vscode 文件夹默认放置在用户家目录下:~/

解决办法:

  • 打开 VScode 设置,在 Code Runner 插件中搜索:File Directory As Cwd,将下面的选项打上勾,重新打开编辑的文件,即可正常

Linux虚拟机CTF环境搭建2.png

  • 如果不使用 Code Runner,而是直接使用 Python 插件,则在 Python 插件中搜索:Execute ln File Dir,将下面的选项打上勾,重新打开编辑的文件,即可正常

Linux虚拟机CTF环境搭建4.png


其他

安装 Chrome 浏览器

众所周知,“Chrome 是世界上最好的浏览器” (手动狗头)

由于最新版的 Chrome 已经不支持 Ubuntu 16.04 了,因此需要自己下载旧版本的 deb 包进行安装

下载地址:Chrome Downloads

下载后解压,直接安装 deb 包即可:

sudo dpkg -i google-chrome-stable_current_amd64.deb

如果安装报错,说明版本不合适,请选择其他更旧的版本

推荐版本:chrome_linux64_stable_101.0.4951.54


安装搜狗输入法

下载 Linux 版搜狗输入法:sogoupinyin_2.3.1.0112_amd64.deb

以参考安装步骤中的 sogoupinyin_2.3.1.0112_amd64.deb 版本为主,使用太新的版本会导致 Ubuntu 重启后无法进入桌面

参考安装步骤:【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细_ubuntu 16.04 安装搜狗输入法-CSDN博客


安装 Typora

查看电脑架构:

uname -m

下载对应的 Typora 安装包:

# x86(amd64)
wget https://download2.typoraio.cn/linux/typora_1.6.6_amd64.deb --output-document typora.deb
  
# ARM
wget https://download2.typoraio.cn/linux/typora_1.6.6_arm64.deb --output-document typora.deb

安装 Typora:

sudo dpkg -i typora.deb

虚拟机代理

这里针对 Ubuntu 16.04 主要介绍虚拟机走主机代理的方法,也是比较推荐这种方法,因为简单方便

如果想在 Ubuntu 16.04 安装 clash 请参考《Ubuntu22.04虚拟机PWN环境搭建》 (可能需要注意版本问题)

将虚拟机网络模式设置为 NAT 或桥接模式 (两种方式物理机 IP 地址不一样,NAT 模式虚拟机走物理机的 VMnet8 虚拟网卡,桥接模式走物理机的 VMnet0 网卡)

这里以 NAT 模式为例,假设物理机 IP 为 192.168.148.1


通过 clash 走代理

物理机在 clash 主界面中打开“局域网代理”(Allow LAN),并查看代理端口,以 7890 为例

在虚拟机中按参数手动设置代理即可:

Linux虚拟机CTF环境搭建12.png


通过 v2rayN 走代理

物理机在 v2rayN 中打开:设置 -> 参数设置 -> 允许来自局域网的连接

在 v2rayN 主界面中,查看局域网的 socks5 和 http 端口号:

Linux虚拟机CTF环境搭建10.png

在虚拟机中按参数手动设置代理即可:

Linux虚拟机CTF环境搭建11.png


创建桌面快捷方式并添加到开始菜单

这里以 IDA Freeware 8.2 为例,因为我 Ubuntu 22.04 安装的是 IDA Freeware 8.2,但是 Ubuntu 16.04 貌似不支持这么新的版本,会无法运行,所以这里主要演示如何创建桌面快捷方式并添加到开始菜单,建议不要安装太高版本的 IDA

在桌面打开终端

新建一个 IDA-Freeware-8.2.desktop 文件: (Ubuntu 16.04 安装 IDA 后会自动在桌面新建一个快捷方式,可以不用手动创建,这里主要演示如何创建桌面快捷方式并添加到开始菜单)

cd ~/桌面
sudo vim IDA-Freeware-8.2.desktop

并写入以下内容: (注意按照自己实际情况修改路径)

[Desktop Entry]
Version=0.9.4
Type=Application
Name=IDA Freeware 8.2
Comment=Interactive Disassembler Freeware 8.2
Icon=/opt/idafree-8.2/appico64.png
Exec=/opt/idafree-8.2/ida64
Terminal=false
MimeType=application/octet-stream;application/mac-binary;application/macbinary;application/octet-stream;application/x-binary;application/x-macbinary
StartupNotify=true
参数含义必要性
[Desktop Entry]文件头,每个 Desktop 文件都以这个标签开始必选
Version标明 Desktop Entry 的版本可选
TypeDesktop 的类型, 常见值有 Application 和 Link必选
Name程序名称,可自定义必选
Comment程序描述,可自定义可选
Icon设置快捷方式的图标,支持 png 和 svg可选
Exec程序的启动命令, 可以带参数运行, 当 Type 为 Application 时有效必选
Terminal是否在终端中运行, 当 Type 为 Application 时有效 (对于没有图形界面的程序很有用)可选
MimeType设置该程序可以打开的文件类型可选
StartupNotify程序启动通知可选

其他 MimeType 可打开的文件类型:完整的 mime type 列表-CSDN博客

增加执行权限:

sudo chmod +x IDA-Freeware-8.2.desktop

最后将 .desktop 文件存放到 /usr/share/applications/ 目录下

程序就会现在开始菜单中,同时也可以在 右键 -> 使用其他应用程序打开 中找到,然后也可以自己将应用固定到任务栏,方便打开

cd ~/桌面
sudo mv IDA-Freeware-8.2.desktop /usr/share/applications/

jetbrains 全家桶等等创建桌面快捷方式就简单了,运行软件后:工具栏 –> Tools –> Create Desktop Entery

以 Pycharm 自动创建的图标为例:

[Desktop Entry]
Version=1.0
Type=Application
Name=PyCharm Professional Edition
Icon=/opt/pycharm-2022.3/bin/pycharm.svg
Exec="/opt/pycharm-2022.3/bin/pycharm.sh" %f
Comment=Python IDE for Professional Developers
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm
StartupNotify=true

创建软连接将应用添加到终端启动

这里以 IDA Freeware 8.2 为例,因为我 Ubuntu 22.04 安装的是 IDA Freeware 8.2,但是 Ubuntu 16.04 貌似不支持这么新的版本,会无法运行,所以这里主要演示如何创建软连接将应用添加到终端启动,建议不要安装太高版本的 IDA

以 IDA 为例:

sudo ln -s "/opt/idafree-8.2/ida64" /usr/bin/ida

这样在终端输入 ida 即可打开 IDA

/usr/bin/ida 中的 ida 名字可以自定义

这样只是在 /usr/bin/ 下创建了一个软链接,指向 /opt/idafree-8.2/ida64
若想删除软链接:

unlink 软链接

尽量不要用 rm -rf 删除软链接,如果不小心加上 '/' 就会删除源文件,例如:rm -rf filename/


终端将 cd 命令与 ls 命令连用

其实就是将 cd xxx 命令变为 cd xxx && ls,好处也显而易见:可以少敲一条命令,方便~

但是 Ubuntu 不支持 chdir,所以不能直接用 alias 实现目录内容的显示

注:以下操作对 Kali Linux 同样适用

如果你的 Ubuntu 配置了 zsh 终端,编辑 ~/zshrc 配置文件(Kali Linux 自带 zsh 终端):

sudo gedit ~/.zshrc

# 如果没有配置 zsh 终端,则打开 ~/.bashrc
sudo gedit ~/.bashrc

在文件最后加入以下内容,保存退出:

alias cd=cdls;
function cdls()
{
    builtin cd "$1" && ls
}

然后使配置生效:

source ~/.zshrc

# 如果没有配置 zsh 终端,则使用如下命令
source ~/.bashrc

然后就可以看到效果了:

Linux虚拟机CTF环境搭建29.png

如果想顺便显示当前所在路径,只需将前面的内容改为:

alias cd=cdls;
function cdls()
{
    builtin cd "$1" && pwd && ls
}

然后就可以看到效果了:

Linux虚拟机CTF环境搭建30.png


配置 SSH 服务端

Linux 默认只安装了 SSH 客户端,有时候在执行 ssh 或者 scp 命令时会出现:ssh: connect to host port 22: Connection refused 拒绝连接

客户端和服务端的关系:
如果 A 机器想被 B 机器远程控制,那么 A 机器需要安装 SSH 服务端,B 机器需要安装 SSH 客户端
例如:B 机器通过 ssh 连接 A 机器,或者 B 机器通过 scp 上传文件到 A 机器

查看 ssh 服务:

dpkg -l | grep ssh

如果只显示有 openssh-client 没有 openssh-server,说明未安装 SSH 服务端

安装:

sudo apt install openssh-server

确认 ssh-server 是否启动:

ps -e | grep ssh

如果看到 sshd 就说明 ssh-server 已经启动

如果出现其他问题的话,查看 SSH 服务端状态:

service ssh status

重启 SSH 服务端:

sudo service ssh restart

相关命令:

  • 连接服务端机器,假设 IP 为 192.168.1.1,用户名为 user (Windows、Linux 通用)
ssh user@192.168.1.1
  • 从客户端机器上传当前目录下的 test 文件到服务端机器的 ~/E:\ 目录下,假设 IP 为 192.168.1.1,用户名为 user
# 服务端为 Linux
sudo scp -r test user@192.168.1.1:~/

# 服务端为 Windows
sudo scp -r test user@192.168.1.1:E:\

其实只传文件的话,不需要 -r 参数,但是传文件夹需要,索性直接加上 -r 更方便

如果使用 ssh 连接出现如下报错:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
......
Host key verification failed.
lost connection

此报错是由于远程的主机的公钥发生了变化导致的

解决办法:
清除 ssh 所连接的 IP

ssh-keygen -R 出问题的IP地址

然后再使用 ssh 重新连接即可