首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
茶余饭后
发新帖
2
1
[原创]cclibc:一个强大的CTF Glibc环境管理工具
发表于: 2026-8-5 00:01
582
[原创]cclibc:一个强大的CTF Glibc环境管理工具
S1nyer
1
2026-8-5 00:01
582
## 前言 前几天重新配置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完成????☝️) <a href="elink@d32K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0x3h3&6&6k6i4u0Q4x3V1k6U0j5$3I4A6j5X3x3`.">cclibc项目地址</a> :<mark class="encrypted">879K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0x3h3&6&6k6i4u0Q4x3V1k6U0j5$3I4A6j5X3x3`.</mark> 各位大佬有空方便点点小星星,谢谢了 ## 安装 一键安装,无需手动download GLIBC ```bash git clone https://github.com/S1nyer/cclibc.git 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会自动识别并切换到目标环境 ## 快速上手 ```bash # 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 目录,**直接启动即可**: ```bash pwndbg ./pwn # 直接可看 libc 符号, 无需任何参数 cclibc debug ./pwn # 等价, 用 pwndbg 启动并额外带上符号路径 ``` 验证符号:`p &system` 应显示 `<__libc_system>`;`ptype struct malloc_chunk` 应展开结构 ## 针对旧 glibc 编译 新 gcc 编译的二进制要求高版本符号(GLIBC_2.34),无法在老 glibc 运行。`compile` 自动下载对应 `libc6-dev` 并修正链接脚本: ```bash cclibc compile hello.c 2.23 cclibc compile hello.c 2.35 --arch i386 # 需要已下载 i386 环境 ```
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
收藏
・
2
点赞
・
1
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
OneMoreThing
+10
期待更多优质内容的分享,论坛有你更精彩!
2026-8-5 00:15
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
S1nyer
1
4
发帖
1
回帖
60
RANK
关注
私信
他的文章
[原创]cclibc:一个强大的CTF Glibc环境管理工具
582
[原创]第二届软件系统安全赛决赛 StudentManagement 详解
5747
[原创]逆向手的锋刃:IDA Hook从入门到实战
13363
[原创]第二届软件系统安全赛 robo_admin 题解
6233
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部