利用树莓派实现arm架构下的heap调试

一切的开始

​ 在最近半年多的比赛中总是可以看到很多都涉及arm架构,比如:红明谷,虎符,国赛等大大小小的比赛都涉及了关于arm架构的题目。常规的做法是搭建quem虚拟机,然后使用gdbserver远程调试,来达到调试目的,当然也可以再用patchelf改一下动态链接库,使用python脚本交互。但是这样调试起来会发现没有调试,这种情况下当然也可以通过查看内存分布来进行调试。缺少了调试符调试起来感觉太麻烦了,也不够直观。当时的第一反应是下载带调试符的libc,当我找到对应版本的带有.debug文件的libc文件,使用patchelf将其和我们的binary绑定,同样使用quem来进行调试,可是这样依旧是显示没有调试符。而且看之前大师傅的博客说quem会存在一些奇奇怪怪的bug,就想是否可以直接使用arm架构的树莓派来搭建环境,调试arm下的题目。网上我查了好久也没找到类似的文章,就只能自己来试试了,顺便写出来分享给大家我的拙见,如果对你有帮助就太好了,也乘此机会搭建起来自己的博客,这就是我写这篇文章的开始,也是我博客的开始。

树莓派的选择和ubuntu镜像烧录

树莓派以及其他硬件的选择

​ 树莓派我选择的是Raspberry Pi 4,内存大小4GB,感觉就调试arm题目的话性能有点溢出,因为不使用桌面,所以内存可以选小一点,没必要选择这么大的内存,当然一切随你喜好。貌似还有香橙派,我不知道怎么样,有兴趣可以尝试,不保证可以搭配后面的流程,但其价格确实可爱的多。

​ 树莓派使用的是tf卡,我觉得没必要买太大容量的,我环境完全搭建完成后也没有用太大的容量,同样是因为不需要桌面的原因。我们可以选择16GB的,这个容量应该是足够了。配套的需要一个一个读卡器来烧录镜像。

​ 电源是5.1v=3.0A的,type-c接口,可以考虑使用手机充电器,但是最好还是买一个充电器比较好,这样比较方便。也可以考虑官方的充电器,就是有点小贵。

​ 顺便一提,最好买个“机箱”,这样能保护好电路板,方便携带,同时要做好散热工作,散热片是要的,也可以使用一个小风扇。类似下图

树莓派机箱和风扇

​ 这里可能还需要使用显示屏和键盘,当然只有第一次搭建的时候需要使用,ubuntu官方文档中说可以不需要,但是我尝试了有一整天,并不能达到我想要的效果,这里放在后面环境搭建的时候再说。树莓派的视频接口是Micro,所以你需要有一头是Micro的视频传输线,也可以使用转换接口,我使用的就是转换接口,毕竟只用这一次,没必要买太贵的,键盘和显示屏都是借用舍友的,这里感谢我的舍友。

​ 硬件就是这些啦,准备好硬件后就可以进行烧录和启动我们的ubuntu系统啦

ubuntu环境的烧录和启动

​ 这里提供一个链接指导我们的安装ubuntu镜像(https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview),

烧录工具

​ 这里有三个不同的选项根据你主机的操作系统选择合适的烧录。具体的烧录方法可以参考上面的链接,内容很详实。一定要仔细看上面的官方文档,不然可能会出现一些奇奇怪怪的问题。

​ 关于树莓派的wifi链接这里有个大坑,官方文档是这样说的:

官方文档截图

但是实际上这里如果没有显示屏和键盘的话无法重启进行重启,也就无法连接到wife,而且由于某些奇怪的原因这个配置文件还需要在开机后再次编写以保证格式,所以之前准备工作才说明需要显示屏和键盘,当然你也可以再尝试尝试,说不定就成功了,有时候挺玄学的。

这里我基本花了一天时间,大多数时间在无意义的修改配置文件,因为没有显示屏转换器,以为是配置文件格式问题,结果花了一天时间都没解决,等转换器到了使用显示器基本一会就解决了,只要你的配置文件格式保证,开机后设置密码,然后重启,重启以后等待一会基本就可以连接到wifi了,如果无法链接,检查一下配置文件

注意:配置文件中冒号后面一定有换行或者空格,而且还要注意对齐

寻找树莓派IP以及ssh连接

寻找树莓派ip地址

官方文档给了一种寻找树莓派的方法,但是我尝试过后感觉并不是很有用,后来发现其mac地址和官方的有出入,假如你使用的是手机热点,并且你的手机热点可以显示ip地址最好不过了,如果是其他情况的话这里我推荐使用Nmap来进行扫描。

这里肯定先要保证你和树莓派在同一个wifi下,然后检查你本地的ip地址win操作系统下使用ipconfig查看本地IP地址

查看本地ip

可以看到ip地址是192.168.43.29,子网掩码是255.255.255.0,那么我们就要检查192.168.43.1/24这个网络下的存活的ip有哪些

使用nmap -sP 192.168.43.1/24命令我们可以看到

寻找树莓派

有两台存活主机,一台是我们主机,那么另一台就是我们的树莓派了,当然可以看到其mac地址后面也告诉我们这台主机是树莓派。这样我们就找到我们树莓派的ip是192.168.43.29。

使用FInallshell进行连接

接下来我推荐使用Finalshell来建立连接。这个工具要比xshell好用好多了

Finalshell

首先点击这里打开连接管理器

连接管理器

再点击这里新建ssh连接

新建ssh连接

以这样的格式填写即可。

然后就可以开始链接我们的树莓派啦,当然你肯定会觉得这个窗口不是很好看,背景挺碍眼的,这里其实可以关闭背景,鼠标右击可以看到下面有设置背景图片

设置背景图片

配置配色字体以及关闭背景

把启用图片的√打掉就好了,此时你还发现取消掉背景怎么还是蓝色的,别着急,看看这里还要配色栏,你有很多钟配色可以选择,最下面有字体大小选择,这样就可以选择合适的字体大小和配色啦(毕竟皮肤和坐骑的搭配才是获胜的关键,这样就可以舒舒服服的进行调试啦。

pwn调试环境搭建

接下来就可以正式开始我们的环境搭建了,这里才是痛苦的开始,在配置环境期间遇到了数不清的问题,这一部分仅供参考,实际安装的时候还是要记得多搜索,毕竟这里每个人遇到的情况都有可能不同。

python2的pip安装和pwntools安装

我们先来解决最困难的,也就是python2的pwntools安装,之前一直是直接使用pip连接并没有发现什么问题,但是这次却有些问题,不管怎么说先安装python2

sudo apt-get update
sudo apt install python
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1

这样就将python的默认为python2了,如下图

python默认pthon2

接下来是pip的安装,现在已经无法正常安装python2的pip了,只能采取一些其他的手法,先安装setup-tools,这里需要先安装打开zip文件的软件

sudo apt install unzip
wget https://pypi.python.org/packages/45/29/8814bf414e7cd1031e1a3c8a4169218376e284ea2553cc0822a6ea1c2d78/setuptools-36.6.0.zip#md5=74663b15117d9a2cc5295d76011e6fd1
unzip setuptools-36.6.0.zip
cd setuptools-36.6.0
sudo python setup.py install

再安装pip

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

查看pip版本pip --version

检查pip版本

说明pip安装完成

接下来安装pwntools

安装pwntools之前还需要一些准备工作,

安装gcc

sudo apt install gcc

安装capstone

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

安装pwntools

sudo apt-get install python-dev
git clone https://github.com/Gallopsled/pwntools
cd pwntools
sudo python setup.py install

验证一下pwntools可用

验证pwntools

如果不出意外,这里pwntools就安装好了,不要尝试用pip安装,基本不可能安装成功的,如果有其他情况就多搜索吧,或者评论区问我,如果我知道怎么回事,会给你回复的。这里pwntools算是安装完成了如果有问题我还是推荐装python3的pwntools吧,可能哪一天python2就不能用了,不是吗,我在装32位arm的ubuntu环境的时候发现无论如何都搞不定,我已经绝望了,还是适应python3吧.

python3安装pwntools的话就简单多了

sudo apt update
sudo apt install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential -y
python3 -m pip install --upgrade pip
pip3 install --upgrade pwntools

pwndbg安装

使用下面命令来安装pwntools

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

验证pwndbg安装

这样就是安装成功啦

patchelf

patchelf是我们用来改写文件ld和libc的这里推荐patchelf_0.12

https://github.com/NixOS/patchelf

github地址在这里里面有详细的教学,这里就不赘述啦

按照官方教程来就好了

glibc all in one

这里还需要glibc all in one,虽然glibc all in one的下的库是x86下的,但是这个可以帮助我们很好的管理gliibc

git clone https://github.com/matrix1001/glibc-all-in-one

使用上面语句进行下载

然后随便下载一个libc,形成文件夹

下载好后需要安装一个库,并形成文件夹

chmod 777 -R glibc-all-in-one/
cd glibc-all-in-one/
sudo pip install requests
./update_list
./download 2.23-0ubuntu11.3_amd64

这样基本就完成了

完成后的效果

类似上图,然后删除debs和libc里的文件,这些都是x86下的,用不到的.

如何更改libc并完成调试

下载libc

当什么的工作都完成了我们就可以开始调试啦,我们以一道题目为例

例子

一般附件会给我们四个文件,这里我们需要的只要libc-2.31.so和题目文件

先将libc放入我们的树莓派系统中

chmod +x libc-2.31.so
./libc-2.31.so

查看libc版本

这样我们就能找到对应的libc版本

在这个网站中我们可以找到不同架构的不同版本libc,只要更改最后的路径即可,需要什么版本搜索什么

https://launchpad.net/ubuntu/+source/glibc/2.31-0ubuntu9.2

寻找libc

点击上图的arm64

需要下载的包下载如图所示的文件(其他版本也是这样格式)到这里*/home/yourneme/glibc-all-in-one/debs,注意yourname是你主机的名字,可以直接拖动到Finallshell显示的该文件夹下,或者*复制

下载路径

路径如图

在glibc目录下运行下面命令(注意更改路径,将ubuntu换成你的名字

./extract /home/ubuntu/glibc-all-in-one/debs/libc6_2.31-0ubuntu9.2_arm64.deb /home/ubuntu/glibc-all-in-one/libs/2.31-0ubuntu9.2_arm64
./extract /home/ubuntu/glibc-all-in-one/debs/libc6-dbg_2.31-0ubuntu9.2_arm64.deb /home/ubuntu/glibc-all-in-one/libs/2.31-0ubuntu9.2_arm64/.debug

这样libc就部署好了。

使用patchelf改变ld和libc

这里提供一个脚本来帮助师傅们更改libc,脚本来源:https://bbs.pediy.com/thread-254868.htm

set -x
libc_path=$1
elf_path=$2
patchelf_bin_path="/home/ubuntu/patchelf/src/patchelf"
if [ -f ${libc_path}/ld-[2].[0-9][0-9].so ]; then
$patchelf_bin_path --set-interpreter $libc_path/ld-[2].[0-9][0-9].so $elf_path
fi
if [ -f $libc_path/libc-[2].[0-9][0-9].so ]; then
$patchelf_bin_path --replace-needed libc.so.6 $libc_path/libc-[2].[0-9][0-9].so $elf_path
fi
set +x

这里的*patchelf_bin_path=”/home/ubuntu/patchelf/src/patchelf”*路径需要师傅们自行更改为自己patchelf的路径,注意不是文件夹是文件夹里的文件

将该脚本命名为chlibc.sh

添加可执行权限

使用该脚本

./chlibc.sh /home/ubuntu/glibc-all-in-one/libs/2.31-0ubuntu9.2_arm64 channel 

第二个路径是你libc文件夹的位置,最后是你文件的位置,这样就实现了对文件的patch,改变了文件的ld和libc

patch

使用ldd验证一下

验证

可以发现没有任何问题

调试验证

我们用gdb调试一下看看

heap可行

这样完成调试,显示heap

bins可行

也可以正常显示bins,这样就完成了我们的环境搭建了。

总结

这是我的第一篇博客啦,有写的有问题的地方还望各位师傅斧正。上面的操作基本可以实现在arm架构下的脚本写exp并调试,如果觉得自带的vim不够方便的话还可以使用远程编辑exp,这个会在日后更新的。这里是本人的一点拙见,希望我写的东西能对你有一丝丝的帮助,感谢每个观看该文章的师傅。

Author: Kr0emer
Link: http://kr0emer.com/2021/07/16/利用树莓派实现arm框架下的heap调试/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.