
Ubuntu 16.04 已经不在官方支持的时间范围内了,所以我的日常环境选择了 Ubuntu 18.04 但是,很多书籍和教程中使用的是 Ubuntu 16.04 , glibc 2.23
在 2022 年的今天,配置一台 Ubuntu 16.04 的 pwn 环境还是有一些必要的,我知道 Ubuntu 18.04或者更高版本可以修改 glibc 版本,以适应题目要求,但作为初学者来说,与教学环境保持一致是非常重要的,避免由于环境带来额外的影响
ps: 如果你认真看了 《Linux 二进制分析》 这本书,并且将其中进程注入的章节详细实验了一遍,你就知道我上面说的话是有道理的
使用 root 直接调试会省很多事,所以这里直接使用 root
默认 Ubuntu 是允许 root 登录的,所以我们进行如下配置

我们直接把当前用户的 bash 环境复制到 root 的根目录(/root/)就好
su root 切换到 root 用户(输入root的密码)
cp /home/debug/.bashrc /root/
其中 debug 为当前用户的名字

在 root 用户的权限下修改 /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 文件的内容
原本内容为:

我们修改一下:
修改这一步你可以使用 vim nano gedit 等文本编辑器,也可以直接执行下面这个命令
echo "greeter-show-manual-login=true" >> /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf

[Seat:*]
user-session=ubuntu
greeter-show-manual-login=true在 root 权限下修改 /root/.profile 文件
原本内容为:

# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
mesg n || true我们将最后一行修改一下

# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
tty -s && mesg n || true
重启一下


这样输入账号密码就可以成功登录了

接下来的操作我们就直接在 root 桌面环境下进行,此时大家可以做一个快照,免得因为时间推移,下面的这些操作也过时了
Ubuntu 16.04 自带的 python3 版本为 3.5.2,我们将其升级至 3.6 升级 python 3 是为了顺利安装 pwntools
升级 Python3 这种事不建议使用任何的 PPA ,实际上 Ubuntu 16.04 可以用来升级 Python3 的PPA 也都不在了,我们选择源码升级
可以参考我在 18 年写的一篇文章
https://mp.weixin.qq.com/s/Z1v7d5M7958yzhGiN3DIkg
https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz
tar -xvf Python-3.6.15.tar.xz

进入到 Python-3.6.15 文件夹中
cd Python-3.6.15

apt-get updatesudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev

./configure --prefix=/usr/local/python3 --enable-optimizations


make
这个命令需要一段时间


make install

报错了,我们修改 /usr/bin/lsb_release
原本是这样的

我们将 python3 改为 python3.5


此时输入 Python3 还是 3.5.2 版本

备份原本的软链接
mv /usr/bin/python3 /usr/bin/python3.bak

新建软链接
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3


此时如果随便输入一个不存在的指令,就会产生下面这个错误告警

编辑这个报错文件
vim /usr/lib/command-not-found

将 #!/usr/bin/python3 修改为 #!/usr/bin/python3.5

此时再输入不存在的指令就会正常显示了

我们升级 Python3 就是为了顺利安装 pwntools

默认会出现这种问题,这个时候我们需要升级一下 pip3
wget https://bootstrap.pypa.io/pip/3.6/get-pip.py
python3 get-pip.py


pip3 install pwntools



成功安装 pwntools
cd /root/
apt install git
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh

如果 git clone 的时候连接不是很通畅,可以考虑打开 https://github.com/pwndbg/pwndbg 直接下载压缩包,网站还是打不开的话,那你懂吧
遗憾的是

哎,报错了,这个报错原因是什么呢?
眼尖的朋友可能已经看到了,我们明明已经把软链接改成我们升级后的 python3.6.15 了,为什么执行 setup.sh 还是使用了 python 3.5.2 了呢?pip 还是 8.1.1 版本呢?
其实这里 Python版本并不是从系统环境变量或者文件软链接来的,而是使用了下面这条命令获取的 gdb 默认依赖的 Python 解释器
gdb -batch -q --nx -ex 'pi import platform; print(".".join(platform.python_version_tuple()[:2]))'
这条指令就是 setup.sh 中使用的
这个时候我想把 gdb 升级一下,之后使用咱们升级后的 Python 3.6.15 版本作为解释器,遗憾的是失败了,之后又想更改原本 gdb 依赖的 Python 解释器,结果没有搜索到操作方法,其实想想也知道,不重新安装很难做到
那么接下来就只能想办法改 pwndbg 了
后来看到一篇文章,找不到具体链接了
sys.stderr.write(f"ERROR: {exc}")这个报错是因为 f-string 这种语法是在 Python3.6 这个版本新增的特性,又是一个简便的语法

具体可以参考
https://zhuanlan.zhihu.com/p/140898888
我们打开报错的文件
/usr/local/lib/python3.5/dist-packages/pip/_internal/cli/main.py

经过查询,我发现就这一个地方使用了 f-string 语法,那好,我们直接把这里改成 Python3.5.2 接受的语法

重新执行 ./setup.sh

遗憾的是依旧报错,因为这里使用的 pip 是 pip3-8.1.1 ,我们需要把 python3.5.2 对应的 pip 进行升级
wget https://bootstrap.pypa.io/pip/3.5/get-pip.py
python3.5 get-pip.py 注意,这里是 python3.5

重新执行 ./setup.sh

成功安装
尝试使用一下

又出现了报错,但是这里我们不怕,我们知道是因为 f-string 导致的,继续修改文件
/root/pwndbg/pwndbg/commands/context.py

修改为

再试一下 pwndbg

搞定!!! 记得做快照!!!