论坛首页 漏洞分析研究区 阅读主题

[原创]解决Pwn题中glibc版本及调试符号、源码问题

161 浏览 13 回复
#1 楼主 2026-06-01 21:09:20
由于pwn题中经常会遇到glibc版本与本地环境不一致,需要patch的问题,遇到流行的版本,本地有对应的文件的情况还比较方便,但是一旦遇到小众版本,尤其是清华镜像站或者glibc-all-in-one找不到的版本时,patch就成了一大问题。同时,下载的glibc如果不包含调试信息,在某些手法的学习或者利用过程中会很不舒服。而且patch题目文件,修改exp对应的文件地址是每次上手pwn题之前必不可少的步骤,因此结合pwninit的功能,利用python实现了一个脚本,可以自动解决这些问题,并在此基础上,提供调试时显示glibc源码的功能,原理参考gdb文档。本文将简要介绍脚本的功能及用法。项目地址:cpwn。安装步骤在项目首页已经作了详细介绍,不再赘述,此处主要通过图文的方式展示实现的功能效果。在b3dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9j5i4g2F1j5$3S2H3j5h3c8Q4x3X3g2F1k6i4c8Q4x3V1k6#2j5Y4g2F1N6s2g2Q4x3V1k6Q4x3V1u0K6L8%4g2J5j5$3g2Q4x3V1k6Y4L8r3W2T1j5#2)9J5c8R3`.`. 上列举了Ubuntu LTS发行版使用的glibc,使用cpwn fetch命令会自动下载这些glibc版本在amd64和i386架构的libc,debug-symbol,source。
在目录下运行cpnw init,如果当前目录不存在glibc则会提示用户选择cpwn包含的glibc版本:

如果目录下存在glibc,但是cpwn没有下载过这个版本的glibc,则会向远程拉取对应版本的glibc:

确定好版本之后会将pwn文件patch,生成pwn_patched,注意被patch的文件必须是没有使用[--set-rpath RPATH]选项patch过的文件:并根据对应的glibc版本生成初始化的exp:在当前目录下运行python ./exp.py GDB可以弹出gdb调试界面,并显示调试符号:

源码:
配置文件默认保存在~/.config/cpwn,对应的目录树为:需要修改模板时可以直接编辑此处的template.py或者修改配置文件中的template的路径:其他配置项也可以按需修改,如果网络情况不好,或者无需下载调试符号,源码,可以修改archs和pkgs,仅仅下载amd64的libc6。$ ldd ./pwn_patched

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-283194.htm
#2 2026-06-01 21:09:20
后续计划添加对libseccomp.so等不在libc6包内的库提供patch支持,另外对于其他功能,有想法的师傅欢迎评论区交流。
#3 2026-06-01 21:09:20
感谢分享,终于能调符号了
#4 2026-06-01 21:09:20
试了下这东西,bug不少:
对于有些二进制文件编译成了application/x-sharedlib格式而不是appliaction/x-executable的可执行文件,程序找不到要patch的二进制文件(cpwn.py的detect函数(206-241行)通过mime来类型为application/*-excutable是可执行文件)。修正这句后,后面subprocess报错提示多了一个参数text=true,注释掉后面又一堆。。。
不清楚这个工具用的python3哪个版本,我在18.04、python3.6下测的,暂时放弃了,自己手动patchelf吧
#5 2026-06-01 21:09:20
好像有点问题,运行cpnw init的时候,程序报错
  File "/usr/bin/cpwn", line 498
SyntaxError: f-string: unmatched '('
#6 2026-06-01 21:09:20
mb_eneyoyay


试了下这东西,bug不少:
对于有些二进制文件编译成了application/x-sharedlib格式而不是appliaction/x-executable的可执行文件,程序找不到要patch的二 ...

师傅你好,对lib的支持暂时没添加进来,后续添加。测试过Ubuntu22.04和24.04版本下的默认python版本,对低版本还没有充分测试,近期进行测试。
#7 2026-06-01 21:09:20
mb_dowwiawp


好像有点问题,运行cpnw init的时候,程序报错
File "/usr/bin/cpwn", line 498
content = f"target ...

这个貌似也是python版本的问题,我去修一下。
#8 2026-06-01 21:09:20
GeekCmore


师傅你好,对lib的支持暂时没添加进来,后续添加。测试过Ubuntu22.04和24.04版本下的默认python版本,对低版本还没有充分测试,近期进行测试。

没想到大佬亲自回复了。当时在18.04下装的初衷是,栈溢出环境主要还是16.04、18.04,有劳大佬在再辛苦一下。
#9 2026-06-01 21:09:20
mb_eneyoyay


没想到大佬亲自回复了。当时在18.04下装的初衷是,栈溢出环境主要还是16.04、18.04,有劳大佬在再辛苦一下。

感觉一般是用较高版本做主力机,碰到低版本程序patch
#10 2026-06-01 21:09:20
这调试就直接能直接有源码嘛?还是需要gdb加载呀
#11 2026-06-01 21:09:20
z2zccc


这调试就直接能直接有源码嘛?还是需要gdb加载呀

调试glibc可以直接有源码
#12 2026-06-01 21:09:20
大佬厉害
#13 2026-06-01 21:09:20
GeekCmore


师傅你好,对lib的支持暂时没添加进来,后续添加。测试过Ubuntu22.04和24.04版本下的默认python版本,对低版本还没有充分测试,近期进行测试。

师傅这个可以就是让用户指定输入程序名,然后后续搜索的时候忽略用户输入的程序名来避免重复搜索,来规避这个问题吗,然后ld和libc自动搜索

最后于 2025-2-27 01:59
被mb_lfqwsomb编辑

,原因: 补充说明
#14 2026-06-01 21:09:20
大佬,为什么cpwn init之后运行生成的exp.py GDB,但是还是没有符号?比如p/x *(struct _IO_FILE_plus*)stdout的时候就显示No struct type named _IO_FILE_plus这种

请登录后参与讨论

立即登录 注册账号