NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Pwntools CTF framework and exploit development library.
Last release 11 months ago
12 Oct 2025
Ships fairly regularly
a new release about every 4 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
12 years old
122 releases · first in 2014
[#2476][2476] Deprecate 'keepends' argument in favor of 'drop' in tube.recvline*
asm()ELF.close() to release resourcessearch_by_symbol_offsets in local libc-databasepwn templatechecksec output of ELF.libc when it was printed for the ELF alreadysni and setting server_hostname manually in remote--offline-only, refactor unstrip and add fetch parser for download libc-databasegdb.attach(('0.0.0.0',12345))tube.upload_manually to upload files in chunkstube.recvline*pwn template to skip Docker library extraction for statically linked binariesgetexport shellcodecolored_traceback error when TERM envvar is unsetprocess.libs() and clean up maps parsingserver tubemipsel architectureOne column per quarter.
Nothing published for this version
Nothing published for this version
[#2451][2451] Show symbols defined to value 0 (start of file)
[#2356][2356] Add local libc database provider for libcdb
search_by_hash series functionoffline_only to search_by_symbol_offsetscontext.newline when setting context.os to "windows"context.log_file and crc.BitPolynomxorNothing published for this version
Nothing published for this version
[#2242][2242] Term module revamp: activating special handling of terminal only when necessary
process instead of replacing itpwn libcdb file crashing if "/bin/sh" string was not foundpwn templatepwn template always set context.binarywhich on WindowsELF.stripped and ELF.debuginfo propertiesflatten argument to ssh.libsgdb.debugNothing published for this version
[#2202][2202] Fix remote and listen in sagemath
remote and listen in sagemathhex command--libc libc.so argument to pwn template commandpwn template commandRETURN_CONST as an allowed _const_code in safeevalNothing published for this version
Nothing published for this version
[#2271][2271] FIX: Generated shebang with path to python invalid if path contains spaces
[#2185][2185] make fmtstr module able to create payload without $ notation
libcdb.search_by_symbol_offsets()ELF.nx and ELF.execstackcontext.newline correctly when typing in tube.interactive()download and download_file with relative pathsNothing published for this version
In memoriam — [Zach Riggle][zach] — long time contributor and maintainer of Pwntools.
In memoriam — Zach Riggle — long time contributor and maintainer of Pwntools.
p2align 2 asm() headers from x86-32, x86-64 and mips architectures to avoid inconsistent instruction length when patching binariesNothing published for this version
[#1975][1975] Add libcdb commandline tool
js_escape() and js_unescape() to util.fiddlingtube.recvpred() timeout argumentNothing published for this version
[#1922][1922] Fix logic in wait_for_debugger
Nothing published for this version
[#1784][1784] Use temporary cache directory when persistent cache cannot be used
[#1733][1733] Update libc headers -> more syscalls available!
self.message and change sys.exc_type to sys.exec_info() in PwnlibExceptionavoid is bytes in python3shellcraft.*.linux.cat2, which uses alloc+read+write instead of sendfileNothing published for this version
[#1429][1429] Add a mechanism for ret2csu (originally #1138)
ignore_config argument to pwnlib.tubes.ssh and improve allow_agent implementationprocess.readmem and process.writememNothing published for this version
Nothing published for this version
[#1902][1902] Always specify -F and -P for tmux in run_in_new_terminal
run_in_new_terminal[#1261][1261] Misc run_in_new_terminal improvements (notably gdb terminated by default)
run_in_new_terminal improvements (notably gdb terminated by default)env['PATH'] to find the path for the executablebaremetal os to debug binaries executed with qemu-system-$(arch)pwnlib.adb is no longer supported in CIpwn.toplevel.__all__$XDG_CONFIG_HOME dir for pwn.confatexit on Python 3Nothing published for this version
Nothing published for this version
[#1541][1541] Use context.newline for tubes by default
context.newline for tubes by defaultasm() and disasm() for MSP430, S390cyclic cli for 64 bit integerspwn template cannot download the remote filepwn shellcraft fasterpwntools/pwntools:stable etc) now use Python3 by default, and includes assemblers for a few common architecturesascii_shellcode (Fixed docs in #1693)i386 and amd64base= argument to ROP.chain() and ROP.dump()LD_PRELOAD and LD_LIBRARY_PATHrequests when doing from pwn import *__setattr__ and __call__ interfaces to ROP for setting registersNothing published for this version
Nothing published for this version
[#1732][1732] Fix shellcraft SSTI vulnerability (first major pwntools vuln!)
[#1576][1576] Add executable= argument to ELF.search
executable= argument to ELF.searchjmp_esp/jmp_rsp attribute to ROPpwn templatepwn version command line toolfiddling.hexdump a way to suppress the total at the end--password for pwn templatecyclic cli for 64 bit integersasm() and disasm() for PowerPC64, MIPS64, Sparc64Nothing published for this version
Nothing published for this version
[#1625][1625] GDB now properly loads executables with QEMU
[#1436][1436] Add ret2dlresolve automation
Nothing published for this version
[#1615][1615] Fix aarch64 pushstr and pushstr_array
Nothing published for this version
[#1517][1517] flat(..., filler=) is fixed for str values and Python2 bytes
str values and Python2 bytes[#1698][1609] Fix issues in packing.flat with mis-ordred fields
packing.flat with mis-ordred fields[#1590][1590] Fix gdb.attach() for remote, listen, ssh tubes
Pwntools requires six v.1.12.0 or higher
six v.1.12.0 or higherFix PLT resolution by locking unicorn <1.0.2rc4
[#1316][1316] Fix connect shellcraft in python 3
Nothing published for this version
[#1412][1412] recvline_pred() and similar do not reorder data
recvline_pred() and similar do not reorder data[#1402][1402] Fix serialtube in python 3
context.encodingNothing published for this version
[#1204][1204] Reduce ROP cache filename length
Nothing published for this version
[#1242][1242] Use IntervalTree 2.xx, disallow use of 3.xx
[#1198][1198] More compatibility fixes for pyelftools==0.25, and pin Sphinx<1.8.0 since it causes testing errors
/proc/.../statusint and syscall instructionsprocess tubesDynELF.dump() for dumping remote ELF filescontext.os via context.binary, useful for Android exploitationpidof on Androidflat() and fit() are now the same function[#1083][1083] Better error messages for gdb when LD_PRELOAD is incorrect
gdb when LD_PRELOAD is incorrectBOOTLDR! imagesrun_in_new_terminalpwntools-gdb wrapper script instead of gdbpwnlib.tubes.server module, which adds a reusable server listenerfit(), allowing dynamic contents to be injected. (This feature is really cool, check out the pull request!)Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →