让程序强行加载特定版本Glibc
通过 LD_LIBRARY_PATH 或者 LD_PRELOAD(库打桩机制:运行时打桩)
因为 ld.so 和 libc.so 不匹配的原因,所以直接设置 LD_PRELOAD 可能会炸,就如下所示…
1 | $ LD_PRELOAD=./libc.so.6 ./baby_tcache |
可以将配套的 ld 和 libc 一起使用即可实现动态加载 libc。只需将下面代码中 LD_PRELOAD 后面的 “/path/to/libc.so.6” (要加载的 libc 的路径)和第二行的 “/path/to/ld.so” (要加载的 ld 的路径)替换成相应文件的路径就行了。
1 | $ LD_PRELOAD=/path/to/libc.so.6; |
在 pwntools 启动程序时,可以按照下面的代码进行设置。
1 | p = process(["/path/to/ld.so", "./test"], |
通过 patchelf 修改 ELF 文件
1 | $ patchelf --set-interpreter /opt/libs/2.27-3ubuntu1_amd64/ld-2.27.so ./patchelf |
先用 “–set-interpreter“ 这个选项来将旧的 ld.so 替换为要加载的 ld.so,然后使用 “–replace-needed“ 这个选项将旧的 libc.so 替换成要加载的 libc.so。在使用 “–replace-needed” 时,第 2 个参数是程序原本的动态库的路径,可以由 ldd $目标文件 得到,第 3 个参数是新的动态库的路径,第 4 个参数为要修改文件的路径。
更换libc脚本:
我写了个简单脚本,使用 “patchelf” 给 ELF 文件 Patch 上 “glibc all in one” 下载的 libc。将下面脚本以 “chlibc.sh” 保存后,只需要
使用 ./chlibc.sh $libc所在目录 $目标文件 就能修改 libc 了。
例如 ./chlibc.sh /opt/libs/2.23-0ubuntu10_i386 echo3 就是将 “echo3” 这个 ELF 文件的 libc 和 ld 换成 /opt/libs/2.23-0ubuntu10_i386 这个目录下的 libc 和 ld。
1 | set -x |
需要注意的是 patchelf 可能会有 Bug,所以使用从 Github 上的代码进行编译得到的 patchelf 能避开一些 Bug。
编译时使用特定libc和ld
1 | gcc xxx.c -o xxx -L/path/to/libc.so -Wl,--rpath=/path/to/libc.so -lc -Wl,--dynamic-linker=/path/to/ld.so |
eg:
1 | gcc fastbin_dup.c -o fastbin_dup3 -L/home/kali/Desktop/Chall/fastbin_dup -Wl,--rpath=/home/kali/Desktop/Chall/fastbin_dup -lc -Wl,--dynamic-linker=/home/kali/tools/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so |
- Title: 让程序强行加载特定版本Glibc
- Author: Chiu
- Created at : 2024-07-31 14:04:20
- Updated at : 2024-07-31 14:07:06
- Link: https://github.com/Idealist17/github.io/2024/07/31/让程序强行加载特定版本Glibc/
- License: This work is licensed under CC BY-NC-SA 4.0.