linux更换题目(可执行文件)libc版本问题
0x00 前言
本文主要记录了在做pwn题目由于libc版本问题需要替换ELF文件
动态连接libc库
的解决方法,此方法同时可以推而广之到linux下的任何ELF文件连接库的修改。
0x01 如何获取不同的glibc
获取不同的glibc
版本这里建议直接使用现有的开源工具glibc-all-in-one,其比较好的一点是可以下载符号表,同时将符号表存入对应版本libc的.debug
文件夹中。
0x02 为什么要下载对应版本的glibc
这个问题也是开始一直困扰的疑问,为什么不直接使用手头分发的glibc
,设置环境变量LD_PRELOAD=./libc.so.6 ./xxx
直接让加载指定的libc执行,而要去下载一个对应版本的glibc重新编译呢?
首先第一个原因是如果系统中的ld.so
和libc.so
不匹配的话,使用LD_PRELOAD
很可能会直接导致程序崩溃,如下所示
找到问题所在就可以对应解决问题了,这时候只需要解决执行时候的ld.so
的链接就可以了
0x03 使用patchelf修改ELF文件
上述的方法每一次运行都需要指定环境变量,比较麻烦,这里强烈安利一款工具patchelf来更改ELF中硬编码的ld
和libc
。
一般 ELF 文件的 ldd
和 file
结果与下面类似,可以看到 libc 等动态库的路径被写死在文件中,而 libc.so.6 是一个符号链接,所指向的文件是真正的 libc。
我们通过 patchelf 修改 ELF 文件达到加载指定版本 libc。我们先用 --set-interpreter
这个选项来将旧的 ld.so 替换为要加载的 ld.so,然后使用 --replace-needed
这个选项将旧的 libc.so 替换成要加载的 libc.so。在使用 --replace-needed
时,第 2 个参数是程序原本的动态库的路径,可以由 ldd $目标文件
得到,第 3 个参数是新的动态库的路径,第 4 个参数为要修改文件的路径。
这里我们修改 "./patchelf" 这个文件的的 libc.so 和 ld.so。根据上面 ldd
的结果,可以知道 ELF 中的 libc 的路径为 "libc.so.6",所以替换 libc 时所使用的第 2 个参数为 "libc.so.6"
然后再用 ldd 和 file 命令查看程序,可以看到 libc 和 ld 都修改成功了。
注:本文大部分内容参考看雪富强民主和谐
帖子,原链接
__EOF__

本文链接:https://www.cnblogs.com/Taolaw/p/16281185.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具