指定glibc编译&&debug

文章发布时间:

最后更新时间:

之前一直都用海量的虚拟机解决编译等问题
如图:)


学到现在发现不是LTS版本的ubuntu维护起来极其麻烦

以下实现一虚拟机下使用不同版本glibc

首先先下载源码https://ftp.gnu.org/gnu/glibc/

之后解压到目录下

1
tar zxvf glibc-2.32.tar.gz

//以下:~/Desktop/glibc-2.32/glibc-2.32 = /path/to/your/libc

1
2
3
4
5
mkdir build
cd build
~/Desktop/glibc-2.32/glibc-2.32/configure --build=x86_64-pc-linux-gnu --prefix=$HOME/Desktop/glibc-2.32/build
make -j8
make install

这里configure的时候可能会提示需要某些依赖或者软件,根据提示信息下载就行
比如我这里提示缺少gawk



那么就

1
sudo apt install gawk

make时间较长,不报错就行

这里有一点需要注意
貌似make成功与否与gcc版本有关系,如下是我的尝试信息
成功


失败


20.04可行 22.04不可行,猜测为低版本gcc能编译高版本glibc源码 待测试

成功走完这里能用了
gcc编译示例。

1
gcc -Wl,-rpath,~/Desktop/glibc-2.32/glibc-2.32 kiwi.c -o k1w1 -static -z noexecstack -fstack-protector-all -pie -z now -masm=intel

若要在gdb中启用,则需要进入gdb后手动指定,如下


若使用pwntools脚本启动,则在启动时如下使用

1
2
from pwn import *
p = process(["/home/str1k3/Desktop/glibc-2.32/elf/ld.so","./pwnfile"],env={"LD_PRELOAD":"/home/str1k3/Desktop/glibc-2.32/libc.so.6"})

可以使用xclibc项目来切换运行libc环境,以下来自项目的README:
这个脚本是基于最新版的glibc-all-in-one,我建议你将其安装到~目录

1
2
3
git clone https://github.com/matrix1001/glibc-all-in-one
cd glibc-all-in-one
./update_list

xclibc脚本配置

1
2
3
4
5
git clone https://github.com/ef4tless/xclibc.git
cd xclibc
sudo rm /usr/local/bin/xclibc
sudo mv ./xclibc /usr/local/bin
sudo chmod +x /usr/local/bin/xclibc

本地libc库部署(*可选)

1
2
xclibc -d all
xclibc -d old

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
xclibc [选项] [参数]
-s [libc文件] # 查看libc文件版本
-x [-n] [文件] [libc文件] # 一键给文件配置libc文件相应版本的环境(添加-n选项可以使用修改--replace-needed的方式实现)
-c [-n] [文件] [libc大版本号] [libc小版本环境路径] # 给文件配置指定的libc环境,输入大版本号后回车,可自由选择复制libc小版本环境路径(添加-n选项可以使用修改--replace-needed的方式实现)
-d <-r/-u> [version]/[all]/[old]
# -d [ENTER] 可以查看所有可下载的libc版本
# -d -r [version] 删除相应的libc版本库
# -d -u 更新glibc-all-in-one libc版本列表(即清华源上有的libc版本列表)
# -d all 下载所有源上有的libc版本
# -d [version] 下载对应版本的libc
-e [deb包] # 解压相应的libc_deb包至glibc_all_in_one路径,通常一个版本需要解压一份本体deb和一份debug_deb包
-r [文件] # 恢复修改过的文件至初始状态
-h # 展示帮助提示
-v # 显示版本号

好用爱用

xclibc能下载到的东西比glibc-all-in-one多,大赞