之前做堆的题总是会与到与libc版本的相关问题,这里开一篇新文,讲一讲目前遇到的有关于在做题的的libc版本不同的问题与解决方案。
patchelf
这个可以说是做堆题的必备神器,大多数的堆的漏洞与版本有关,不同的版本的堆题对bin和chunk的管理方式各不相同,故很多题目在附件中会一同把libc版本一同下发,遇到这种事便可以直接在我们本地的libc库中寻找到相应的版本然后直接patchelf上题就行。关于这个工具的使用具体可以看之前的有篇文章,写的有这里不细讲
食用方法
1 | patchelf --set-interpreter libc文件名(包括路径) --set-rpath libc文件所在的文件夹全名(包括路径) pwn(文件名) |
寻找libc
有的题目并不会直接把libc文件下发,而是同题目一起发一个libc.so.6文件,这个文件其实也能看出这道题要使用的libc版本,不过要使用一个命令。
1 | strings libc.so.6 | grep GLIBC |
这样也能知道这个的libc版本为Ubuntu GLIBC 2.31-0ubuntu9.2
然后在patchef相应的libc做这道题就行。
libc版本下载
关于libc版本的的下载,这个确实在glibc-all-in-one这里面就已经有大部分的libc版本。
先讲这个里面有的libc版本的食用吧
这是里面有的文件,在这里面的libc文件夹里面就是我们已经下了的libc文件,如果里面没有我们需要的libc版本,这我们可以这里在个页面下,
先使用cat list
查看我们可以再这里面下的版本,先确定要下的版本的名字后使用下面这个命令下载
1 | ./download 版本名字 |
像这样就算这个版本下好了,然后便可以去之前那个的libc文件夹中食用了。
出了这些之外,还可以使用宁外一个命令查看和下载宁外一些版本
1 | cat old_list |
这里面也有一些版本的现在,不过由于是过时的版本所以加上了old,
同样的在下载时也要用不同的命令下载
1 | ./download_old 版本名 |
这样下好之后就可以去libc文件夹中食用了。
如果你发现这两个里面都没有你所要的libc版本(有的题目是真的ex,非要用一些小版本)
那便要去网上下相应的文件解压食用了。
拿上面的需要的libc2.31的9.2版本来说,这个版本在我们的这里是没有的我们只能去网上找了下来用,
在之前的文件中有一个debs的文件夹其中放着的就是各个libc版本的deb文件,我们要下的也是这种文件,
amd64 build : 2.31-0ubuntu9.2 : glibc package : Ubuntu (launchpad.net)
可以在这个网站上下载
把这个标黄的下载来就行
拖动到之前的那个debs文件夹中便是这个样子,
然后解压就行,
以下来源于Ubuntu系统下deb包的解压、打包、安装、卸载及常用命令_ubuntu解压deb-CSDN博客这篇文章。
1.首先下载deb包,比如:将其放在 /home/tools/ 根目录下:
2.进入到tools根目录下的终端,输入下面命令创建文件夹extract,并在extract文件夹下创建DEBIAN文件夹
1 | mkdir -p extract/DEBIAN |
3.将deb包解压到extract文件夹下
1 | dpkg -X ./xxx.deb extract |
4.解压deb包中的control信息(包的依赖在这里面的control文件中)
1 | dpkg -e ./xxx.deb extract/DEBIAN |
5.创建build文件夹
1 | mkdir build |
6.将解压到extract文件夹中所有的内容重新打包为deb包
1 | dpkg-deb -b extract build/ |
7.安装deb包
1 | dpkg -i xxx.deb (如果出现权限拒绝,在 dpkg 前加上 sudo 即可) |
8.卸载deb包
1 | dpkg -r xxx.deb ( -r 参数只是删除了软件包,不能完全删除其配置文件,如果想要连同配置文件一起删除,可以使用 -P 参数) |
常用命令参数实例
1 | dpkg -i package.deb #安装包 |
我们只要运行的第四部就可以食用了
打开同目录的extract文件夹,在打开里面的lib文件夹里面的那个就存放这我们要的libc版本,然后使用相同的patchelf就可以开始食用题目了。