0%

glibc 版本

更换glibc版本

1.下载glibc_all_in_one

步骤 1:安装依赖工具

bash: sudo apt install patchelf git

步骤 2:下载 glibc-all-in-one

bash: git clone https://github.com/matrix1001/glibc-all-in-one.git

cd glibc-all-in-one

2.下载对应版本的glibc(2.23为例)

./update_list

cat list | grep 2.23

./download 2.23-0ubuntu3_amd64

问题

image-20250725165210090

出现sudo: unable to execute ./update_list: No such file or directory错误,看似矛盾(ls明明显示文件存在),实际是因为update_list脚本的解释器路径无效或脚本本身存在损坏。具体解决步骤如下:

1.检查update_list脚本的头部解释器

# 查看脚本首行 head -n 1 ./update_list

正常输出应为:

#!/bin/bash

3.更换

❯ patchelf –set-interpreter /home/jc/glibc-all-in-one/libs/2.23-0ubuntu3_i386/ld-2.23.so
–set-rpath /home/jc/glibc-all-in-one//libs/2.23-0ubuntu3_i386/
./pwn160

image-20250725165549637

注意路径!!!

4.检查

image-20250725165853663

5.换回去

image-20250725170102584

1.patchelf –remove-rpath ./hacknote

清除之前通过--set-rpath指定的 glibc 库路径

2.patchelf –set-interpreter /lib/i386-linux-gnu/ld-linux.so.2 ./hacknote

恢复系统默认的动态链接器

64 位程序的默认链接器是/lib64/ld-linux-x86-64.so.2,但 32 位程序必须使用 32 位链接器/lib/i386-linux-gnu/ld-linux.so.2(若路径不同,可通过dpkg -L libc6:i386 | grep ld-linux查询)。

另一种方法

编译不同版本的glibc

首先要使用不同版本的glibc,我们需要有不同版本的 glibc 可执行文件,也就是 libc.so 和 ld.so。这两个文件是程序运行时所需要的文件按。

当然也可以在网上找已经编译好的libc,但是找不到时自己编译的步骤如下:

glibc-all-in-one:是一个开源项目,里面有各种版本的glibc 源码。

然后编译glibc 的命令如下:

git clone https://github.com/matrix1001/glibc-all-in-one

cd glibc-all-in-one

chmod 777 build download extract

sudo ./build 2.29 amd64 #编译glibc
sudo ./build 2.27 amd64
sudo ./build 2.23 amd64

加载glibc

对于一个可执行文件,可以通过 LD_PRELOAD 来指定其使用 对应版本的 glibc。但是这里需要注意,还得指定一个对应版本的 ld.so,不然 可能会出现问题。

使用方法如下,我习惯将 ld.so 和 libc.so.6 放到与程序同目录下。也可以自己改变路径。

p = process([“ld.so”, “./test”],
env={“LD_PRELOAD”:”libc.so.6”})
通过上面的操作,我们就可以指定 test 加载对应版本的 glibc。

更换动态链接库

image-20251201153641147