2022 年 Ubuntu 16.04 配置 pwn 环境的一些小问题

2022-08-31 10:15:45 浏览数 (1)

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

代码语言:javascript复制
[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

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

0 人点赞