CTF思路
点击放大

> [!NOTE]
> The deepwiki of pwncli: <
一开始写这个工具是因为在学习pwn的过程中,经常反复的去注释和取消注释gdb.attach(xxx)这样的语句,下不同断点的时候要不断地修改脚本,本地调通打远程的时候也要改脚本。
习惯命令行操作后,我设想能否设计一个命令行工具,能通过命令行参数去控制一些东西,避免在调试pwn题的时候重复地执行上面这些工作而只专注于编写解题脚本。当想法酝酿起来,自己便试着写下第一行代码,于是,pwncli就此诞生。
工具的目的在于实用性,我觉得pwncli满足实用性要求,在调试pwn题时能节省大量的时间。
如果你觉得pwncli好用,请介绍给周围的pwner。如果你还有任何疑问,请提交issue或,我将非常乐意与你讨论交流。如果你有好的想法,或者发现新的bug,欢迎提交pull requests。
🏴🏴🏴 欢迎各位师傅关注我的个人博客,以下两个博客网站内容相同,互为备份。前者为github page,后者部署在国内阿里云服务器上。博客持续更新中~
pwncli是一款简单、易用的pwn题调试与攻击工具,能提高你在CTF比赛中调试pwn题脚本的速度与效率。
pwncli可以帮助你快速编写pwn题攻击脚本,并实现本地调试和远程攻击的便捷切换。pwncli支持三种使用模式:
以上三种模式分别简称为:命令行模式、脚本模式和库模式。其中,命令行模式与其他命令行工具(如linux下的ls、tar等命令)使用方式相同,可用于本地交互调试;脚本模式可将自己编写的python攻击脚本包装为命令行工具,然后调用子命令执行所需功能;库模式则只会调用一些便捷的工具函数,方便快速解题。
在下面的使用模式章节将会详细的阐述三种模式的使用方式与技巧。
pwncli设计为主命令-子命令模式(与git类似),目前已拥有的(子)命令有:
其中,pwncli为主命令,config/debug/misc/patchelf/qemu/remote为一级子命令,list/set为隶属config的二级子命令,gadget/setgdb为隶属misc的二级子命令。
pwncli支持命令的前缀匹配(与gdb的命令前缀匹配类似),通常只需要给出命令的前缀即可成功调用该命令。即输入pwncli debug ./pwn、pwncli de ./pwn和pwncli d ./pwn的执行效果是完全一样的。但是,必须保证前缀不会匹配到两个或多个子命令,否则将会抛出MatchError的匹配错误。
pwncli极易扩展。只需要在pwncli/commands目录下添加cmd_xxx.py,然后编写自己的子命令即可。pwncli会自动探测并加载子命令。例如,你想新增一个magic命令,你只需要:
当需要移除该命令时,可以删除cmd_magic文件,或将其重命名为非cmd_开头即可。
pwncli依赖于click 和 pwntools。前者是一款优秀的命令行编写工具,后者是pwner普遍使用的攻击库。
总结pwncli的优点为:
gdb命令pwncli可以在linux和windows下使用,但在windows下使用受限严重,如debug命令将无法使用,remote命令仅部分可用。pwncli只能在python3环境上使用,目前暂不考虑与python2兼容。建议在ubuntu系统上使用pwncli,特别的,如果你了解WSL并选择使用WSL解答pwn题,pwncli + WSL将是一个极佳的选择。debug子命令为WSL系统设计了许多实用的参数,并实现了一些有趣的功能。
如果你选择使用WSL,那么,请尽量保证发行版的名字(distribution name)为默认的Ubuntu-16.04/Ubuntu-18.04/Ubuntu-20.04/Ubuntu-22.04。debug命令的某些选项与默认发行版名称联系紧密。
pwncli的安装方式有两种,第一种是本地安装(强烈建议使用此种方式安装):
安装结束后,别忘了将pwncli所在的路径添加到PATH环境变量,其路径一般为~/.local/bin。可以在家目录下的.bashrc/.zshrc文件中添加export PATH=$PATH:/home/xxx/.local/bin。
这种方式安装的好处是:当你需要pwncli保持更新时,只需要执行git pull即可使用最新版本的pwncli。
第二种安装方式是使用pip3安装:
这种方式安装的pwncli可能不是最新版本,会遇到一些已解决的bug。不过请相信我,我会及时将pwncli更新到pypi上去的。
安装结束后,执行pwncli --,看到版本信息输出则代表安装成功。
pwncli视为一个命令行工具,虽然其本质是一个python脚本。使用pwncli -h或者pwncli --help将会获取到命令行的使用指导。如果你想获取某个子命令的使用指导,如debug命令,输入pwncli debug -h即可。pwncli当作命令行工具使用外,你还可以将脚本封装为一个命令行工具,之后,就能像使用pwncli一样使用这个脚本。 exp.py,在脚本中写下:然后,在命令行输入python3 exp.py -h即可获得和命令行模式下pwncli -h一样的输出。特别的,如果你在脚本的第一行指定了解释器路径,那么你可以输入./exp.py -h而无需显式输入python3。
之后,你可以将exp.py当成pwncli,使用pwncli所拥有的各项命令与功能。
当然,你可以丰富你的脚本,使其实现更多功能,如使用debug和remote命令时,你可以在脚本后面继续添加:
熟悉pwntools的小伙伴对上面的脚本肯定不会陌生。从本质上来说,调用cli_script()后会解析命令行参数,之后将一些有用的数据放置在gift中。如你可以取出io,就是pwntools模块中的process或remote对象,并与其交互。
pwncli的一些函数或功能而不需要使用命令行解析参数的场景。你可以像使用其他python库一样使用pwncli,如在脚本中写下:不难发现,库模式与命令模式的使用区别:去掉cli_script()即可。需要注意,库模式下的脚本就是一个普通的python脚本,并不能解析命令行参数。
asciinema版本教程依次如下:
![asciicast]()
![asciicast]()
![asciicast]()
![asciicast]()
以下为简易的文字版教程。
在使用pwncli之前,建议掌握gdb/tmux的基本命令,确保已安装了pwndbg/gef/peda等其中一个或多个插件。
以脚本模式下的debug命令为例(这也是最常使用的模式和命令)。
首先进入tmux环境,使用tmux new -s xxx进入即可。
然后在脚本exp.py里写下:
然后赋予脚本执行权限,然后输入./exp.py de ./pwn -t即可看到开启了tmux调试窗口。
对于无PIE的程序,下断点的方式为:
对于有PIE的程序,下断点的方式为:
想要hook掉某些函数,如ptrace:
使用带桌面的ubuntu虚拟机调试,可以选择gnome弹出窗口:
脚本调试好后需要打远程:
flag选项:带上该选项即为开启,如ls -a中的-a即为flag选项-x y1 -x y2可以传递y1和y2给x选项-x --xxx --xxx-xx,那么使用-x或者--xxx或者--xxx-xxx均可pwncli命令为主命令,输入pwncli -h将得到以下输出:
选项:
命令(即pwncli下拥有的子命令):
pwncli debug -h将得到以下帮助文档:debug子命令是最常用的子命令,为其设计的参数也最多,下面将详细讲述每一个参数的意义和使用方式。
参数:
选项:
输入pwncli remote -h得到以下帮助:
remote也是使用较多的子命令,用于远程攻击靶机。在本地调试好脚本后,只需要将debug命令替换为remote,并设置参数,即可开始攻击靶机,不需要更改脚本。
参数:
选项:
config子命令主要用于操作pwncli的配置文件,配置文件的路径为~/.pwncli.conf,其指导为:
选项:
命令:
输入pwncli config list -h获得如下输出:
参数:
选项:
输入pwncli config set -h获得如下输出:
参数:
选项:
misc子命令是一个杂项命令合集,即其会包含许多二级子命令,每个二级子命令的功能都不一样。
输入pwncli misc -h得到帮助信息:
选项:
命令:
输出pwncli misc gadget -h得到帮助信息:
参数:
选项:
输出pwncli misc setgdb -h得到帮助信息:
选项:
其中gdb-pwndbg的内容为:
使用patchelf修改二进制文件使用的libc.so.6和ld.so。使用该命令的前提是,已安装patchelf和glibc-all-in-one,并将各个版本的库文件放置在glibc-all-in-one/libs,该路径可在配置文件中配置。
输入pwncli patchelf -h得到帮助信息:
参数:
选项:
该子命令方便使用qemu进行其他架构arm/mips文件的调试以及kernel pwn的调试。该命令的使用与debug子命令非常类似,很多选项与参数与debug子命令相同,使用方法也是一样的。在使用该子命令之前,请确保已安装了qemu和所需依赖库。
输入pwncli qemu -h得到帮助信息:
参数:
选项:
该子命令方便生成各种攻击模板脚本文件,包括使用pwncli的命令行模式与脚本模式的攻击脚本,同时还提供了使用原生的pwntools需要使用到的模板。模板中定义了本地调试与远程攻击的相关代码,提供了常用的缩写函数,如sa/sla/r/rl等。
输入pwncli template -h 得到帮助信息:
其中,cli类型模板会使用pwncli的脚本模式,lib类型模板会使用库模式,pwn类型模板直接使用原始的pwntools来构建而不会使用pwncli。
pwncli的依赖库清单如下所示:
!image-019621
pwncli - ./test:
!image-116090
pwncli - ./test -t:
!image-356871
pwncli de ./test -t -b main:
!image-710687
这个时候没有断住:
pwncli de ./test -p -t -b main:
!image-858593
!image-946892
pwncli de ./test -H puts:
!image-434698
pwncli de ./test -t -s "vmmap;b main":
!image-628316
pwncli de ./test -w:
!image-900484
pwncli de ./test -w -m wsl-u:
!image-010903
pwncli de ./test -w -m wsl-wts:
!image-057770
pwncli de ./test -t -g pwndbg:
!image-152877
pwncli de ./test -u:
!image-307876
pwncli re ./test 127.0.0.1:10001:
!image-042604
pwncli -vv re ./test -i 127.0.0.1 -p 10001:
!image-158851
pwncli -vv re 127.0.0.1:10001:
!image-248653
pwncli config list example:
!image-423624
pwncli misc gadget ./test:
!image-602674
sudo pwncli misc setgdb -g:
!image-738869
pwncli patchelf ./test -b 2.31:
!image-851991
TODO
开发语言:Python
Star 数:437
该项目属于CTF思路方向的开源资源,代码结构清晰,适合安全研究人员学习参考。项目围绕Do pwn by command line展开,提供了可运行的实现,对理解相关安全机制、工具原理与攻防技术具有较高的研究价值。
从技术实现角度看,此类项目的核心在于对底层原理的深入理解与工程化落地。开发者在研究过程中可以结合官方文档与社区讨论,梳理项目的初始化流程、核心模块职责与数据流转,逐步掌握其中的技术细节与设计思路。
1. 下载源码压缩包,解压到本地环境。
2. 根据项目类型准备对应的运行环境与依赖。
3. 按照 README 中的步骤完成配置与部署。
4. 在隔离的测试环境中运行验证,避免影响生产系统。
本资源来源于开源社区,仅供安全研究、技术学习与合法授权范围内的攻防演练使用,请勿用于任何非法或侵害他人权益的用途。使用本项目产生的一切后果由使用者自行承担。
| 资源标题 | pwncli - Do pwn by command line |
| 所属分类 | CTF思路 |
| 发布作者 | admin |
| 发布时间 | 2026-10-05 23:41:41 |
| 下载权限 | 免费下载 |
| 附件数量 | 2 个下载链接 |
| 浏览次数 | 359 |
| 讨论数量 | 0 |
| 主题状态 | 正常讨论中 |