-
-
[原创]cclibc:一个强大的CTF Glibc环境管理工具
-
发表于: 1天前 324
-
前言
前几天重新配置CTF PWN环境,在搭libc环境的时候发现glibc-all-in-one重构了,自己之前常用的一个libc切换工具也拉闸了。然后自己用glibc-all-in-one下载libc版本同时配置调试符号花了点时间(2.23到2.31到2.34之后,每个版本操作都有些差异),但这些步骤其实很机械,而且用patchelf修改libc环境也没有一键式脚本方便。
在CTF PWN中,有这么几个常见场景
- 修改ELF文件的GLIBC环境
- 补全调试符号路径
- 在老版本LIBC中编译C/C++程序
为了快速处理这些场景,我决定开发一个简单易用的GLIBC环境管理工具,于是cclibc诞生了。
为什么叫cclibc呢?因为主要用Claude Code开发(前后拷打了两天AI完成????☝️)
cclibc项目地址 :c30K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0x3h3&6&6k6i4u0Q4x3V1k6U0j5$3I4A6j5X3x3`.
各位大佬有空方便点点小星星,谢谢了
安装
一键安装,无需手动download GLIBC
git clone ba5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0x3h3&6&6k6i4u0Q4x3V1k6U0j5$3I4A6j5X3y4Q4x3X3g2Y4K9i4b7`.
cd cclibc
sudo ./install.sh
流程:检查/安装系统依赖 → glibc-all-in-one + glibc-aio → 软链接 cclibc 到 /usr/local/bin(PATH 仅此一种方式)→ 询问是否下载 libc
下载 libc 时二选一:
| 模式 | 说明 |
|---|---|
standard(推荐) |
仅 LTS 版 amd64 libc:2.23 / 2.27 / 2.31 / 2.35 / 2.39,不下载 old-releases |
advanced |
全量所有 libc 版本(含 old-releases 补全) |
两种模式对同一 glibc 主版本都只下载最新修订


命令参数
| 命令 | 说明 |
|---|---|
switch <elf> <目标> [-n] |
切换环境;-n 用 replace-needed 方式 |
restore <elf> |
恢复备份 |
check <elf> |
查看 ELF 环境 / libc 版本信息 |
list / download <版本> |
已下载环境 / 下载(封装 glibc-aio) |
gdb <elf> / debug <elf> |
打印 gdb 命令 / pwndbg 启动调试 (自动带符号) |
run <elf> |
直接运行 |
compile <src> [版本] [-o out] [--arch] |
针对旧 glibc 编译 |
fix-dbg <版本> |
补建调试符号 (build-id + 库目录绑定) |
cclibc <elf> = check
cclibc <elf> <目标> = switch 简写,如:cclibc <elf> 2.35 (自动选最接近版本)
目标还可以写成./libc.so.6,cclibc会自动识别并切换到目标环境
快速上手
# 1. 识别 libc 版本
$ cclibc ./libc-2.23.so
文件 : libc-2.23.so
架构 : amd64
版本 : 2.23-0ubuntu11.3
BuildID : 30773be8cf5bfed9d910c8473dd44eaab2e705ab
[+] 已下载的精确环境: 2.23-0ubuntu11.3_amd64
# 2. 一键切换
$ cclibc ./pwn 2.23-0ubuntu11.3_amd64
[*] ELF: ./pwn (amd64)
[+] 已备份原文件 → ./pwn.cclibc.bak
[+] interpreter → /home/kali/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/x86_64-linux-gnu/ld-linux-x86-64.so.2
[+] RUNPATH → /home/kali/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/x86_64-linux-gnu
[+] 调试符号已绑定 (23 个库)
[+] 切换完成: ./pwn → 2.23-0ubuntu11.3_amd64
# 3. 确认当前环境
$ cclibc ./pwn
ELF : ./pwn (amd64)
Interpreter : /home/kali/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/x86_64-linux-gnu/ld-linux-x86-64.so.2
RPATH/RUNPATH: /home/kali/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/x86_64-linux-gnu
NEEDED : libc.so.6
[+] → 当前环境: 2.23-0ubuntu11.3_amd64
# 4. gdb 调试
$ cclibc debug ./pwn
pwndbg> p &system
$2 = (int (*)(const char *)) 0x7ffff78453a0 <__libc_system>
pwndbg> p *stdout
$4 = {
_flags = 0xfbad2887,
_IO_read_ptr = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_read_end = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_read_base = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_write_base = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_write_ptr = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_write_end = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_buf_base = 0x7ffff7bc56a3 <_IO_2_1_stdout_+131> "\n",
_IO_buf_end = 0x7ffff7bc56a4 <_IO_2_1_stdout_+132> "",
_IO_save_base = 0x0,
_IO_backup_base = 0x0,
_IO_save_end = 0x0,
_markers = 0x0,
_chain = 0x7ffff7bc48e0 <_IO_2_1_stdin_>,
_fileno = 0x1,
_flags2 = 0x0,
_old_offset = 0xffffffffffffffff,
_cur_column = 0x0,
_vtable_offset = 0x0,
_shortbuf = "\n",
_lock = 0x7ffff7bc6780 <_IO_stdfile_1_lock>,
_offset = 0xffffffffffffffff,
_codecvt = 0x0,
_wide_data = 0x7ffff7bc47a0 <_IO_wide_data_1>,
_freeres_list = 0x0,
_freeres_buf = 0x0,
__pad5 = 0x0,
_mode = 0xffffffff,
_unused2 = '\000' <repeats 19 times>
}
gdb 调试
switch 时已自动把调试符号绑定到 libc 目录,直接启动即可:
pwndbg ./pwn # 直接可看 libc 符号, 无需任何参数
cclibc debug ./pwn # 等价, 用 pwndbg 启动并额外带上符号路径
验证符号:p &system 应显示 <__libc_system>;ptype struct malloc_chunk 应展开结构
针对旧 glibc 编译
新 gcc 编译的二进制要求高版本符号(GLIBC_2.34),无法在老 glibc 运行。compile 自动下载对应 libc6-dev 并修正链接脚本:
cclibc compile hello.c 2.23
cclibc compile hello.c 2.35 --arch i386 # 需要已下载 i386 环境
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。