# libc 应用

# libc 修补

由于靶机运行环境与本地机器环境可能不同,会导致程序实现的方式有所差异。

尤其是对于堆题而言,不同版本有不同的检测机制以及 tcache 的有无和截然不同的安全检测。使得 libc 的修正变得十分重要。

目前主要有以下几种方法实现 libc 的修正。

  1. 使用 patchelf 修改 elf 文件的依赖
  2. pwntools 中利用 process 指定 libc 版本。
  3. 在 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
更新于

请我喝[茶]~( ̄▽ ̄)~*

Walt CSZ 微信支付

微信支付

Walt CSZ 支付宝

支付宝