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 直接调试会省很多事,所以这里直接使用 root
默认 Ubuntu 是允许 root 登录的,所以我们进行如下配置
1. 为 root 设置密码
2. 为 root 配置 bash 环境
我们直接把当前用户的 bash 环境复制到 root 的根目录(/root/
)就好
su root
切换到 root 用户(输入root的密码)
cp /home/debug/.bashrc /root/
其中 debug 为当前用户的名字
3. 配置允许 root 桌面登录
在 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
文件
原本内容为:
代码语言:javascript复制# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
mesg n || true
我们将最后一行修改一下
代码语言:javascript复制# ~/.profile: executed by Bourne-compatible login shells.
if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi
tty -s && mesg n || true
重启一下
这样输入账号密码就可以成功登录了
接下来的操作我们就直接在 root 桌面环境下进行,此时大家可以做一个快照,免得因为时间推移,下面的这些操作也过时了
升级 Python3
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
下载 Python 3.6.15 源代码
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 update
sudo 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
编译安装 Python3.6
./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
解决 CommandNotFound
此时如果随便输入一个不存在的指令,就会产生下面这个错误告警
编辑这个报错文件
vim /usr/lib/command-not-found
将 #!/usr/bin/python3
修改为 #!/usr/bin/python3.5
此时再输入不存在的指令就会正常显示了
安装 pwntools
我们升级 Python3 就是为了顺利安装 pwntools
默认会出现这种问题,这个时候我们需要升级一下 pip3
升级 pip3
wget https://bootstrap.pypa.io/pip/3.6/get-pip.py
python3 get-pip.py
继续安装 pwntools
pip3 install pwntools
成功安装 pwntools
安装 pwndbg
下载源码
cd /root/
apt install git
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
如果 git clone
的时候连接不是很通畅,可以考虑打开 https://github.com/pwndbg/pwndbg
直接下载压缩包,网站还是打不开的话,那你懂吧
遗憾的是
哎,报错了,这个报错原因是什么呢?
gdb 的 Python 解释器
眼尖的朋友可能已经看到了,我们明明已经把软链接改成我们升级后的 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
了
后来看到一篇文章,找不到具体链接了
代码语言:javascript复制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
接受的语法
升级 Python3.5.2 对应的pip3
重新执行 ./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 语法问题
尝试使用一下
又出现了报错,但是这里我们不怕,我们知道是因为 f-string
导致的,继续修改文件
/root/pwndbg/pwndbg/commands/context.py
修改为
再试一下 pwndbg
搞定!!! 记得做快照!!!