# libc 应用
# libc 修补
由于靶机运行环境与本地机器环境可能不同,会导致程序实现的方式有所差异。
尤其是对于堆题而言,不同版本有不同的检测机制以及 tcache 的有无和截然不同的安全检测。使得 libc 的修正变得十分重要。
目前主要有以下几种方法实现 libc 的修正。
- 使用 patchelf 修改 elf 文件的依赖
- pwntools 中利用 process 指定 libc 版本。
- 在 docker 容器中运行和调试
# patchelf 修改 libc
该方式会修改文件本身,尽量先对文件进行备份。主要会修改文件内依赖的地址,可能造成文件内部分数据的地址出现偏移。
利用 patchelf
或者 process(["/path/to/ld.so", "./test"], env={"LD_PRELOAD":"/path/to/libc.so.6"})
指定 libc 版本运行。
# How to run in custom libc version?
cp /glibc/2.27/64/lib/ld-2.27.so /tmp/ld-2.27.so
patchelf --set-interpreter /tmp/ld-2.27.so ./test
LD_PRELOAD=./libc.so.6 ./test
# pwntools 指定 libc
from pwn import *
p = process(["/path/to/ld.so", "./test"], env={"LD_PRELOAD":"/path/to/libc.so.6"})
具体参考 https://github.com/skysider/pwndocker
# 查找 libc
# 利用 glibc-all-in-one
只能查到每个大版本内的初始版本和最新版本
# 利用官网
拥有最全的版本
如 buuoj 一般使用 libc6_2.23-0ubuntu10_*
的版本作为题目的 libc 库,该版本无法在 glibc-all-in-one 中下载。
在官网找到 libc 后进行解包。
dpkg-deb -x libc6_2.23-0ubuntu10_amd64.deb ./libc |
libc 历史版本
# ubuntu 对应 libc 版本
ubuntu | libc |
---|---|
16.04 | 2.23 |
18.04 | 2.27 |
19 | 2.29 |
20.04 | 2.30 |
22.04 | 2.37 |