patchup--命令行小工具
patchup
该工具是我自用的一个小工具(针对于做pwn题的辅助工具)(本工具的实现非常简单,而且这个工具的核心是依赖patchelf和glibc-all-in-one这两个工具),用于快速修改本地ELF
文件的libc使其与远程服务器那边所运行的程序依赖的libc
库一样
从而避免了因为 libc
问题,而导致本地打通了但是远程没打通的尴尬情况。因为每次都手动 patch libc
的过程太过于重复,而且有概率出错,同时受到了roderick
师傅写的 pwncli
的启发,于是就有自己写一个命令行工具的想法。
如果你想看施工现场,请见 github仓库
部署
由于这个小工具依赖的核心依然是 patchelf
和 glibc-all-in-one
,能让它以命令行工具的身份出现,还少不了python中的 click
模块。
因此你应该有如下东西 patchelf
glibc-all-in-one
,如果有的话请直接看下面的 install patchup 部分,如果没有的话下文就是相关部署。
install patchelf
直接使用预编译的二进制文件
wget https://github.com/NixOS/patchelf/releases/download/0.14.5/patchelf-0.14.5-x86_64.tar.gz |
手动编译 patchelf
git clone https://github.com/NixOS/patchelf |
install glibc-all-in-one
git clone https://github.com/matrix1001/glibc-all-in-one |
cd 到上级目录
install patchup
ok,假设你现在有了 patchelf
和 glibc-all-in-one
那么你就可以输入以下命令来安装 patchup
这个小工具了
git clone https://github.com/polishing-labs/patchup.git |
可以输入patchup –help命令查看帮助,如果出现下面图片所展示的内容,则说明安装成功。
patchup --help |
最后目录结构应该如下
glibc-all-in-one(目录) |
示例
假设你有一个 名为 demo
ELF 文件,他现在默认的 libc
库是 2.27
的,但是服务器那边的这个程序所依赖的 libc
库是2.23的
那么你就可以使用以下命令,去为你的ELF文件patch一个 2.23
的 libc
库。(-b
是备份的意思,建议每次使用 patchup
时都开启该选项,-c
是自主选择小版本libc的选项,开启这个选项你可以选择小版本不同的2.23
的libc
库,如果不开启,则默认是匹配到2.23版本的第一个libc
库)
patchup demo 2.23 -b |
glibc-all-in-one中没有所需要的libc
假设你的 glibc-all-in-one
中空空如也(没有所需要的libc版本),别担心,你依旧可以输入上面的命令。patchup
将会为你自动下载(如果你需要的话)效果如下:
此时 match_libc_success_match
展示了当前可以下载的libc版本,你可以输入下面索引来选择它们(第一个索引是0,第二个索引是1,以此类推)
等待下载成功后,将自动进行 patch
(如果不想下载的话,可以输入q退出)
使用题目指定的libc库
如果题目给定了一个libc库,别担心 patchup
依旧会正常工作,patchup
将会去寻找相应匹配的 ld
,如果有的话则会直接链接,
没有的话则会自动下载(如果你需要的话),如下图
值得一提的就是,我碰见过使用patchup
之后patch
指定libc
是失败的,不过我检查了一下发现这并不是patchup
的问题,应该是patchelf
出了点bug
,所以碰到这种情况,可以换成glibc-all-in-one
中版本一样的libc
库试试。
Thanks
尽管本工具异常的简单,但是对于我这个不太聪明的大一学生来说,写的过程也并不一帆风顺。感谢 Roderick 师傅带给我的启发以及解答一些我的困惑,也感谢我的队员 Timochan , 如果没有他,关于这个工具在其他主机上的一些环境部署我可能无法实现