Linux 安装不同版本的 Glibc
做 CTF pwn 的时候,肯定是要经常用到不同的 glibc 版本,这篇文章就是阐述如何安装不同版本的 glibc 并且使用。
下载libc
下载好以后解压然后 cd
进去(以下操作都是在这个目录或里面的子目录里面进行),然后先创建几个文件夹
mkdir build build32 x64 x86
其中:
- build目录是用来放编译64位版本的中间文件的
- build32目录是用来放编译32位版本的中间文件的
- x64目录是编译好64位的版本后install的位置
- x32目录是编译好32位的版本后install的位置
- (名字和位置可以改,知道哪个是哪个就好了)
编译libc
编译64位的glibc
编译如果失败看看文章后面有没有提到解决方法。
# 进入 build 目录
# 注意这是一行!!
CC="gcc" CXX="g++" CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector" ../configure --prefix=/home/allen/.local/lib/glibc-2.31/x64 --disable-werror
# 可根据电脑配置开多线程 -> make -j n (n是线程数,如果电脑很闲的话建议是核数的两倍)
make -j 4 && make install
看这里: 编译失败怎么办
1. 原因一: 本地的 glibc 版本太新了
比如 2.32 安装 2.31 就会有问题,但是安装 2.29 就没有问题,所以我用 2.29 来安装 2.31
CC="gcc" CXX="g++" CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector -Wl,--rpath=/home/allen/.local/lib/glibc-2.29/x64/lib -Wl,--dynamic-linker=/home/allen/.local/lib/glibc-2.29/x64/lib/ld-2.29.so" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector -Wl,--rpath=/home/allen/.local/lib/glibc-2.29/x64/lib -Wl,--dynamic-linker=/home/allen/.local/lib/glibc-2.29/x64/lib/ld-2.29.so" ../configure --prefix=/home/allen/.local/lib/glibc-2.31/x64 --disable-werror
2. 原因二: glibc 2.27 确实好像有点问题
在网上有补丁: https://sourceware.org/legacy-ml/libc-stable/2018-03/msg00009.html
使用 git apply patch.txt 打上补丁就好了
命令参数解释
命令 | 解释 |
---|---|
g -g3 -ggdb -gdwarf-4 |
加上各种 debug_info |
Og |
不进行优化,这样的话编译出来的东西人才能更好地看懂 |
Wno-error -w 和 --disable-werror |
防止一些奇奇怪怪但有不怎么重要的 error 的 |
fno-stack-protector |
2.23 版本时遇到某一个 error 的时候加上的 |
prefix |
这个非常重要,如果不指定默认会覆盖掉系统的 glibc |
编译32位的glibc
# 进入 build32 目录
# 注意要把这几行合并成一行!!
CC="gcc -m32" CXX="g++ -m32" CFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector" CXXFLAGS="-g -g3 -ggdb -gdwarf-4 -Og -Wno-error -w -fno-stack-protector" ../configure --prefix=/home/allen/.local/lib/glibc-2.31/x86 --host=i686-linux-gnu --disable-werror
make -j 4 && make install
删除相关目录减少磁盘容量
首先是make clean
,然后把build
和build32
两个文件夹删掉
运行二进制文件时指定glibc版本
首先查看所用的libc
文件,可以看到使用libc
为libc.so.6
,使用ld
为/lib/ld-linux.so.2
ldd demo
# 输出结果如下
linux-gate.so.1 (0xf7ed6000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf7cb2000)
/lib/ld-linux.so.2 => /usr/lib/ld-linux.so.2 (0xf7ed8000)
利用
patchelf
,更改libc
路径patchelf --replace-needed libc.so.6 /home/allen/.local/lib/glibc-2.31/x64/lib/libc-2.31.so demo
利用
patchelf
,更改ld
路径patchelf --set-interpreter /home/allen/.local/lib/glibc-2.31/x64/lib/ld-2.31.so demo
参考文件
1. 官方下载地址: https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/
2. 编译时主要的参考: https://0xffff.one/d/337
3. 指定版本时主要的参考: https://bbs.pediy.com/thread-254868.htm