Skip to content

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,然后把buildbuild32两个文件夹删掉

运行二进制文件时指定glibc版本

首先查看所用的libc文件,可以看到使用libclibc.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

Comments