100% found this document useful (1 vote)
2K views156 pages

Pwntools

The document is a user manual for the pwntools exploit development framework, providing an overview of the framework and how to install and get started with it, including importing modules from pwntools to get functionality for writing exploits, assembling shellcode, and interacting with binaries.

Uploaded by

Ömer Coşkun
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
2K views156 pages

Pwntools

The document is a user manual for the pwntools exploit development framework, providing an overview of the framework and how to install and get started with it, including importing modules from pwntools to get functionality for writing exploits, assembling shellcode, and interacting with binaries.

Uploaded by

Ömer Coşkun
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

pwntools Documentation

Release 2.2

Gallopsled et al

January 05, 2015

Contents

Getting Started
1.1 About pwntools . . .
1.2 Installation . . . . . .
1.3 Getting Started . . . .
1.4 from pwn import
1.5 Command Line Tools

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

3
3
4
6
9
12

Module Index
2.1 [Link] Assembler functions . . . . . . . . . . . . . . . . . .
2.2 [Link] Callbacks on unhandled exception . . . .
2.3 [Link] Replacement for atexit . . . . . . . . . . . . . . .
2.4 [Link] Easy access to header file constants . . . . .
2.5 [Link] Setting runtime variables . . . . . . . . . . . .
2.6 [Link] Resolving remote functions using leaks . . . . . .
2.7 [Link] Working with ELF binaries . . . . . . . . . . . . . .
2.8 [Link] Pwnlib exceptions . . . . . . . . . . . . . .
2.9 [Link] Working with GDB . . . . . . . . . . . . . . . . . . .
2.10 [Link] and Logging stuff . . . . . . . . . . . . . . . . . . . .
2.11 [Link] Helper class for leaking memory . . . . . . . .
2.12 [Link] Replacements for various functions . . .
2.13 [Link] Return Oriented Programming . . . . . . . . . . . . .
2.14 [Link] Shellcode generation . . . . . . . . . . . .
2.15 [Link] Terminal handling . . . . . . . . . . . . . . . . . .
2.16 [Link] Timeout handling . . . . . . . . . . . . . . . .
2.17 [Link] Talking to the World! . . . . . . . . . . . . . . . .
2.18 [Link] Functions for user interaction . . . . . . . . . . . . . .
2.19 [Link] A database of useragent strings . . . . . . .
2.20 [Link] Calculating CRC-sums . . . . . . . . . . . . .
2.21 [Link] Generation of unique sequences . . . . . .
2.22 [Link] Utilities bit fiddling . . . . . . . . . . .
2.23 [Link] Hashing functions . . . . . . . . . . . . .
2.24 [Link] Extension of standard module itertools
2.25 [Link] Operations on lists . . . . . . . . . . . . .
2.26 [Link] We could not fit it any other place . . . . . .
2.27 [Link] Networking interfaces . . . . . . . . . . . . .
2.28 [Link] Packing and unpacking of strings . . . .
2.29 [Link] Working with /proc/ . . . . . . . . . . . .
2.30 [Link] Safe evaluation of python code . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

17
17
19
20
20
21
29
31
35
35
37
38
43
44
45
56
56
58
76
76
77
107
108
112
114
124
126
129
130
136
138

. .
. .
. .
*
. .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

2.31 [Link] Utilities for working with the WWW . . . . . . . . . . . . . . . . . . . . 139


3

Indices and tables

141

Python Module Index

143

ii

pwntools Documentation, Release 2.2

pwntools is a CTF framework and exploit development library. Written in Python, it is designed for rapid prototyping and development, and intended to make exploit writing as simple as possible.

Contents

pwntools Documentation, Release 2.2

Contents

CHAPTER 1

Getting Started

1.1 About pwntools


Whether youre using it to write exploits, or as part of another software project will dictate how you use it.
Historically pwntools was used as a sort of exploit-writing DSL. Simply doing from pwn import * in a previous
version of pwntools would bring all sorts of nice side-effects.
When redesigning pwntools for 2.0, we noticed two contrary goals:
We would like to have a normal python module structure, to allow other people to faster get familiar with how
pwntools works.
We would like to have even more side-effects, especially by putting the terminal in raw-mode.
To make this possible, we decided to have two different modules. pwnlib would be our nice, clean Python module,
while pwn would be used during CTFs.

1.1.1 pwn Toolbox optimized for CTFs


As stated, we would also like to have the ability to get a lot of these side-effects by default. That is the purpose of this
module. It does the following:
Imports everything from the toplevel pwnlib along with functions from a lot of submodules. This means that if
you do import pwn or from pwn import *, you will access to everything you need to write an exploit.
Calls [Link]() to put your terminal in raw mode and implementing functionality to make it
look like it is not.
Setting the [Link].log_level to info.
Tries to parse some of the values in [Link] and every value it succeeds in parsing it removes.

1.1.2 pwnlib Normal python library


This module is our clean python-code. As a rule, we do not think that importing pwnlib or any of the submodules
should have any significant side-effects (besides e.g. caching).
For the most part, you will also only get the bits you import.
[Link] simply by doing import [Link].

You for instance not get access to

Though there are a few exceptions (such as [Link]), that does not quite fit the goals of being simple
and clean, but they can still be imported without implicit side-effects.

pwntools Documentation, Release 2.2

1.2 Installation
pwntools is best supported on Ubuntu 12.04 and 14.04, but most functionality should work on any Posix-like distribution (Debian, Arch, FreeBSD, OSX, etc.).

1.2.1 Prerequisites
In order to get the most out of pwntools, you should have the following system libraries installed.
Binutils
Assembly of foreign architectures (e.g. assembling Sparc shellcode on Mac OS X) requires cross-compiled versions
of binutils to be installed. Weve made this process as smooth as we can.
In these examples, replace $ARCH with your target architecture (e.g., arm, mips64, vax, etc.).
Ubuntu

First, add our Personal Package Archive repository.


$ apt-get install software-properties-common
$ apt-add-repository ppa:pwntools/binutils
$ apt-get updatez

Then, install the binutils for your architecture.


$ apt-get install binutils-$ARCH-linux-gnu

Mac OS X

Mac OS X is just as easy, but requires building binutils from source. However, weve made homebrew recipes to
make this a single command. After installing brew, grab the appropriate recipe from our binutils repo.

$ brew install [Link]

Alternate OSes

If you want to build everything by hand, or dont use any of the above OSes, binutils is simple to build by hand.
#!/usr/bin/env bash
V=2.25
# Binutils Version
ARCH=arm # Target architecture
cd /tmp
wget -nc [Link]
wget -nc [Link]
gpg --keyserver [Link] --recv-keys 4AE55E93
gpg --verify binutils-$[Link]
rm -rf binutils-*

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

tar xf binutils-$[Link]
mkdir binutils-build
cd binutils-build
export AR=ar
export AS=as
../binutils-$V/configure \
--prefix=/usr/local \
--target=$ARCH-unknown-linux-gnu \
--disable-static \
--disable-multilib \
--disable-werror \
--disable-nls
MAKE=gmake
hash gmake || MAKE=make
$MAKE -j
sudo $MAKE install

Capstone
Capstone is a disassembly library required for gathering ROP gadgets and ROP chain generation.
Its a separate requirement from binutils because its used by Jon Salwans ROPgadget tool which we use under
the covers.
In particular, version 2.1.2 should be used. Capstone can be downloaded here, or installed with the steps below.
Ubuntu
$ wget -nc [Link]
$ apt-get install capstone-2.1.2_amd64.deb

Mac OS X
$ brew install capstone

Python Development Headers


Some of pwntools Python dependencies require native extensions (for example, Paramiko requires PyCrypto).
In order to build these native extensions, the development headers for Python must be installed.
Ubuntu
$ apt-get install python-dev

1.2. Installation

pwntools Documentation, Release 2.2

Mac OS X

No action needed.

1.2.2 Released Version


Pwntools is available as a pip package.
$ apt-get install python2.7 python2.7-dev python-pip
$ pip install pwntools

1.2.3 Latest Version


Alternatively if you prefer to use the latest version from the repository:
$ git clone [Link]
$ cd pwntools
$ pip install -e .

1.3 Getting Started


To get your feet wet with pwntools, lets first go through a few examples.
When writing exploits, pwntools generally follows the kitchen sink approach.
>>> from pwn import *

This imports a lot of functionality into the global namespace. You can now assemble, disassemble, pack, unpack, and
many other things with a single function.
A full list of everything that is imported is available on from pwn import *.

1.3.1 Making Connections


You need to talk to the challenge binary in order to pwn it, right? pwntools makes this stupid simple with its
[Link] module.
This exposes a standard interface to talk to processes, sockets, serial ports, and all manner of things, along with some
nifty helpers for common tasks. For example, remote connections via [Link].
>>> conn = remote([Link],21)
>>> [Link]()
220 ...
>>> [Link](USER anonymous\r\n)
>>> [Link]( , drop=True)
331
>>> [Link]()
Please specify the password.\r\n
>>> [Link]()

Its also easy to spin up a listener

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

>>> l = listen()
>>> r = remote(localhost, [Link])
>>> c = l.wait_for_connection()
>>> [Link](hello)
>>> [Link]()
hello

Interacting with processes is easy thanks to [Link].


>>> sh = process(/bin/sh)
>>> [Link](sleep 3; echo hello world;)
>>> [Link](timeout=1)

>>> [Link](timeout=5)
hello world\n
>>> [Link]()

Not only can you interact with processes programmatically, but you can actually interact with processes.
>>> [Link]()
$ whoami
user

Theres even an SSH module for when youve got to SSH into a box to perform a local/setuid exploit with
[Link]. You can quickly spawn processes and grab the output, or spawn a process and interact
iwth it like a process tube.
>>> shell = ssh(bandit0, [Link], password=bandit0)
>>> shell[whoami]
bandit0
>>> shell.download_file(/etc/motd)
>>> sh = [Link](sh)
>>> [Link](sleep 3; echo hello world;)
>>> [Link](timeout=1)

>>> [Link](timeout=5)
hello world\n
>>> [Link]()

1.3.2 Packing Integers


A common task for exploit-writing is converting between integers as Python sees them, and their representation as a
sequence of bytes. Usually folks resort to the built-in struct module.
pwntools makes this easier with [Link]. No more remembering unpacking codes, and littering
your code with helper routines.
>>> import struct
>>> p32(0xdeadbeef) == [Link](I, 0xdeadbeef)
True
>>> leet = [Link](hex)
>>> u32(abcd) == [Link](I, abcd)[0]
True

The packing/unpacking operations are defined for many common bit-widths.


>>> u8(A) == 0x41
True

1.3. Getting Started

pwntools Documentation, Release 2.2

1.3.3 Setting the Target Architecture and OS


The target architecture can generally be specified as an argument to the routine that requires it.
>>> asm(nop)
\x90
>>> asm(nop, arch=arm)
\x00\xf0 \xe3

However, it can also be set once in the global context. The operating system, word size, and endianness can also be
set here.
>>>
>>>
>>>
>>>

[Link]
[Link]
[Link]
context.word_size

=
=
=
=

i386
linux
little
32

Additionally, you can use a shorthand to set all of the values at once.
>>> asm(nop)
\x90
>>> context(arch=arm, os=linux, endian=big, word_size=32)
>>> asm(nop)
\xe3 \xf0\x00

1.3.4 Setting Logging Verbosity


You can control the verbosity of the standard pwntools logging via context.
For example, setting
>>> context.log_level = debug

Will cause all of the data sent and received by a tube to be printed to the screen.

1.3.5 Assembly and Disassembly


Never again will you need to run some already-assembled pile of shellcode from the internet! The [Link]
module is full of awesome.
>>> asm(mov eax, 0).encode(hex)
b800000000

But if you do, its easy to suss out!


>>> print disasm([Link](hex))
0:
6a 02
push
0x2
2:
58
pop
eax
3:
cd 80
int
0x80
5:
eb f9
jmp
0x0

However, you shouldnt even need to write your own shellcode most of the time! Pwntools comes with the
[Link] module, which is loaded with useful time-saving shellcodes.
Lets say that we want to setreuid(getuid(), getuid()) followed by duping file descriptor 4 to stdin, stdout, and stderr,
and then pop a shell!

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

>>> asm([Link]() + [Link](4)).encode(hex)


6a3158cd8089c389d96a4658cd806a045b6a0359496a3f58cd8075f86a68682f2f2f73682f62696e89e331c96a0b5899cd80

1.3.6 Misc Tools


Never write another hexdump, thanks to [Link].
Find offsets in your buffer that cause a crash, thanks to [Link].
>>> print cyclic(20)
aaaabaaacaaadaaaeaaa
>>> # Assume EIP = 0x62616166 (faab) at crash time
>>> print cyclic_find(faab)
120

1.3.7 ELF Manipulation


Stop hard-coding things! Look them up at runtime with [Link].
>>> e = ELF(/bin/cat)
>>> print hex([Link])
0x400000
>>> print hex([Link][write])
0x401680
>>> print hex([Link][write])
0x60b070
>>> print hex([Link][write])
0x401680

You can even patch and save the files.


>>> e = ELF(/bin/cat)
>>> [Link]([Link]+1, 3)
ELF
>>> [Link]([Link], ret)
>>> [Link](/tmp/quiet-cat)
>>> disasm(file(/tmp/quiet-cat,rb).read(1))

0:
c3
ret

1.4 from pwn import *


The most common way that youll see pwntools used is
>>> from pwn import *

Which imports a bazillion things into the global namespace to make your life easier.
This is a quick list of most of the objects and routines imported, in rough order of importance and frequency of use.
context
[Link]
Responsible for most of the pwntools convenience settings
Set context.log_level = debug when troubleshooting your exploit

1.4. from pwn import *

pwntools Documentation, Release 2.2

Scope-aware,
so you can disable logging
[Link]

for

subsection

of

code

via

remote, listen, ssh, process


[Link]
Super convenient wrappers around all of the common functionality for CTF challenges
Connect to anything, anywhere, and it works the way you want it to
Helpers for common tasks like recvline, recvuntil, clean, etc.
Interact directly with the application via .interactive()
p32 and u32
[Link]
Useful functions to make sure you never have to remember if > means signed or unsigned for
[Link], and no more ugly [0] index at the end.
Set signed and endian in sane manners (also these can be set once on context and not bothered
with again)
Most common sizes are pre-defined (u8, u64, etc), and [Link]() lets
you define your own.
log
[Link]
Make your output pretty!
cyclic and cyclic_func
[Link]
Utilities for generating strings such that you can find the offset of any given substring given only N
(usually 4) bytes. This is super useful for straight buffer overflows. Instead of looking at 0x41414141,
you could know that 0x61616171 means you control EIP at offset 64 in your buffer.
asm and disasm
[Link]
Quickly turn assembly into some bytes, or vice-versa, without mucking about
Supports any architecture for which you have a binutils installed
Over 20 different architectures have pre-built binaries at ppa:pwntools/binutils.
shellcraft
[Link]
Library of shellcode ready to go
asm([Link]()) gives you a shell
Templating library for reusability of shellcode fragments
ELF
[Link]
ELF binary manipulation tools, including symbol lookup, virtual memory to file offset helpers, and
the ability to modify and save binaries back to disk

10

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

DynELF
[Link]
Dynamically resolve functions given only a pointer to any loaded module, and a function which can
leak data at any address
ROP
[Link]
Automatically generate ROP chains using a DSL to describe what you want to do, rather than raw
addresses
[Link] and [Link]
[Link]
Launch a binary under GDB and pop up a new terminal to interact with it. Automates setting breakpoints and makes iteration on exploits MUCH faster.
Alternately, attach to a running process given a PID, [Link] object, or even just a socket
thats connected to it
args
Dictionary contining all-caps command-line arguments for quick access
Run via python [Link] REMOTE=1 and args[REMOTE] == 1.
Can also control logging verbosity and terminal fancyness
* NOTERM
* SILENT
* DEBUG
randoms, rol, ror, xor, bits
[Link]
Useful utilities for generating random data from a given alphabet, or simplifying math operations that
usually require masking off with 0xffffffff or calling ord and chr an ugly number of times
net
[Link]
Routines for querying about network interfaces
proc
[Link]
Routines for querying about processes
pause
Its the new getch
safeeval
[Link]
Functions for safely evalutaing python code without nasty side-effects.
These are all pretty self explanatory, but are useful to have in the global namespace.
hexdump

1.4. from pwn import *

11

pwntools Documentation, Release 2.2

read and write


enhex and unhex
more
group
align and align_down
urlencode and urldecode
which
wget
Additionally, all of the following modules are auto-imported for you. You were going to do it anyway.
os
sys
time
requests
re
random

1.5 Command Line Tools


pwntools comes with a handful of useful command-line utilities which serve as wrappers for some of the internal
functionality.

1.5.1 asm
Assemble shellcode into bytes
line
Lines to assemble. If none are supplied, use stdin
-h, --help
show this help message and exit
-f <format>, --format <format>
Output format (defaults to hex for ttys, otherwise raw)
-o <file>, --output <file>
Output file (defaults to stdout)
-c <<opt>>, --context <<opt>>
The os/architecture the shellcode will run in (default: linux/i386), choose from: aarch64, alpha, amd64, arm,
avr, cris, freebsd, i386, ia64, linux, m68k, mips, mips64, msp430, powerpc, powerpc64, s390, sparc, sparc64,
thumb, vax, windows

12

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

1.5.2 constgrep
Looking up constants from header files.
Example: constgrep -c freebsd -m ^PROT_ 3 + 4
regex
The regex matching constant you want to find
constant
The constant to find
-h, --help
show this help message and exit
-e <<constant name>>, --exact <<constant name>>
Do an exact match for a constant instead of searching for a regex
-i, --case-insensitive
Search case insensitive
-m, --mask-mode
Instead of searching for a specific constant value, search for values not containing strictly less bits that the given
value.
-c <<opt>>, --context <<opt>>
The os/architecture to find constants for (default: linux/i386), choose from: aarch64, alpha, amd64, arm, avr,
cris, freebsd, i386, ia64, linux, m68k, mips, mips64, msp430, powerpc, powerpc64, s390, sparc, sparc64, thumb,
vax, windows

1.5.3 cyclic
Cyclic pattern creator/finder
count
Number of characters to print
-h, --help
show this help message and exit
-a <alphabet>, --alphabet <alphabet>
The alphabet to use in the cyclic pattern (defaults to all lower case letters)
-n <length>, --length <length>
Size of the unique subsequences (defaults to 4).

-l <<lookup value>>, -o <<lookup value>>, --offset <<lookup value>>, --lookup <<lookup valu
Do a lookup instead printing the alphabet

1.5.4 disasm
Disassemble bytes into text format
hex
Hex-string to disasemble. If none are supplied, then it uses stdin in non-hex mode.
-h, --help
show this help message and exit

1.5. Command Line Tools

13

pwntools Documentation, Release 2.2

-c <<opt>>, --context <<opt>>


The architecture of the shellcode (default: i386), choose from: powerpc64, aarch64, sparc64, powerpc, mips64,
msp430, thumb, amd64, sparc, alpha, s390, i386, m68k, mips, ia64, cris, vax, avr, arm

1.5.5 elfdiff
a
b
-h, --help
show this help message and exit

1.5.6 elfpatch
elf
File to patch
offset
Offset to patch in virtual address (hex encoded)
bytes
Bytes to patch (hex encoded)
-h, --help
show this help message and exit

1.5.7 hex
Hex-encodes data provided on the command line or via stdin.
data
Data to convert into hex
-h, --help
show this help message and exit

1.5.8 phd
Pwnlib HexDump
file
File to hexdump. Reads from stdin if missing.
-h, --help
show this help message and exit
-w <width>, --width <width>
Number of bytes per line.
-l <highlight>, --highlight <highlight>
Byte to highlight.
-s <skip>, --skip <skip>
Skip this many initial bytes.

14

Chapter 1. Getting Started

pwntools Documentation, Release 2.2

-c <count>, --count <count>


Only show this many bytes.
-o <offset>, --offset <offset>
Addresses in left hand column starts at this address.
--color <color>
Colorize the output. When auto output is colorized exactly when stdout is a TTY. Default is auto.

1.5.9 shellcraft
Microwave shellcode Easy, fast and delicious
<shellcode>
The shellcode you want
<arg>
Argument to the chosen shellcode
-h, --help
show this help message and exit
-?, --show
Show shellcode documentation
-o <<file>>, --out <<file>>
Output file (default: stdout)
-f <<format>>, --format <<format>>
Output format (default: hex), choose from {r}aw, {s}tring, {c}-style array, {h}ex string, hex{i}i, {a}ssembly
code, {p}reprocssed code

1.5.10 unhex
Decodes hex-encoded data provided on the command line or via stdin.
hex
Hex bytes to decode
-h, --help
show this help message and exit

1.5. Command Line Tools

15

pwntools Documentation, Release 2.2

16

Chapter 1. Getting Started

CHAPTER 2

Module Index

Each of the pwntools modules is documented here.

2.1 [Link] Assembler functions


Utilities for assembling and disassembling code.

2.1.1 Architecture Selection


Architecture, endianness, and word size are selected by using [Link].
Any parameters which can be specified to context can also be specified as keyword arguments to either
asm() or disasm().

2.1.2 Assembly
To assemble code, simply invoke asm() on the code to assemble.
>>> asm(mov eax, 0)
\xb8\x00\x00\x00\x00

Additionally, you can use constants as defined in the [Link] module.


>>> asm(mov eax, SYS_execve)
\xb8\x0b\x00\x00\x00

Finally, asm() is used to assemble shellcode provided by pwntools in the shellcraft module.
>>> asm([Link]())
jhh///sh/bin\x89\xe31\xc9j\x0bX\x99\xcd\x80

2.1.3 Disassembly
To disassemble code, simply invoke disasm() on the bytes to disassemble.
>>> disasm(\xb8\x0b\x00\x00\x00)

0:
b8 0b 00 00 00
mov

eax,0xb

17

pwntools Documentation, Release 2.2

[Link](code, vma = 0, ...) str


Runs cpp() over a given shellcode and then assembles it into bytes.
To see which architectures or operating systems are supported, look in [Link].
To support all these architecture, we bundle the GNU assembler and objcopy with pwntools.
Parameters
shellcode (str) Assembler code to assemble.
vma (int) Virtual memory address of the beginning of assembly
Kwargs: Any arguments/properties that can be set on context
Examples
>>> asm("mov eax, SYS_select", arch
\xb8]\x00\x00\x00
>>> asm("mov eax, SYS_select", arch
\xb8\x17\x00\x00\x00
>>> asm("mov rax, SYS_select", arch
H\xc7\xc0\x17\x00\x00\x00
>>> asm("ldr r0, =SYS_select", arch
\x04\x00\x1f\xe5R\x00\x90\x00

= i386, os = freebsd)
= amd64, os = linux)
= amd64, os = linux)
= arm, os = linux, bits=32)

[Link](shellcode, ...) str


Runs CPP over the given shellcode.
The output will always contain exactly one newline at the end.
Parameters shellcode (str) Shellcode to preprocess
Kwargs: Any arguments/properties that can be set on context
Examples
>>> cpp("mov al, SYS_setresuid", arch = "i386", os = "linux")
mov al, 164\n
>>> cpp("weee SYS_setresuid", arch = "arm", os = "linux")
weee (0x900000+164)\n
>>> cpp("SYS_setresuid", arch = "thumb", os = "linux")
(0+164)\n
>>> cpp("SYS_setresuid", os = "freebsd")
311\n

[Link](data, ...) str


Disassembles a bytestring into human readable assembler.
To see which architectures are supported, look in [Link].
To support all these architecture, we bundle the GNU objcopy and objdump with pwntools.
Parameters
data (str) Bytestring to disassemble.
vma (int) Passed through to the adjust-vma argument of objdump
Kwargs: Any arguments/properties that can be set on context
18

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Examples
>>> print disasm([Link](hex), arch = i386)
0:
b8 5d 00 00 00
mov
eax,0x5d
>>> print disasm([Link](hex), arch = amd64)
0:
b8 17 00 00 00
mov
eax,0x17
>>> print disasm([Link](hex), arch = amd64)
0:
48 c7 c0 17 00 00 00
mov
rax,0x17
>>> print disasm([Link](hex), arch = arm)
0:
e51f0004
ldr
r0, [pc, #-4]
; 0x4
4:
00900052
addseq r0, r0, r2, asr r0
>>> print disasm([Link](hex), arch = thumb, bits=32)
0:
f04f 0005
mov.w
r0, #5

[Link].which_binutils(util, **kwargs)
Finds a binutils in the PATH somewhere. Expects that the utility is prefixed with the architecture name.
Examples
>>> import platform
>>> which_binutils(as, arch=[Link]())
.../bin/as
>>> which_binutils(as, arch=arm)
.../bin/arm-...-as
>>> which_binutils(as, arch=powerpc)
.../bin/powerpc...-as
>>> which_binutils(as, arch=msp430)
...
Traceback (most recent call last):
...
Exception: Could not find as installed for ContextType(arch = msp430)
Traceback (most recent call last):
...
Exception: Could not find as installed for ContextType(arch = msp430)

2.2 [Link] Callbacks on unhandled exception


Analogous to atexit, this module allows the programmer to register functions to be run if an unhandled exception
occurs.
[Link](func, *args, **kwargs)
Registers a function to be called when an unhandled exception occurs. The function will be called with positional
arguments args and keyword arguments kwargs, i.e. func(*args, **kwargs). The current context is
recorded and will be the one used when the handler is run.
E.g. to suppress logging output from an exception-handler one could write:
with [Link](log_level = error):
[Link](handler)

An identifier is returned which can be used to unregister the exception-handler.


This function can be used as a decorator:

2.2. [Link] Callbacks on unhandled exception

19

pwntools Documentation, Release 2.2

@[Link]
def handler():
...

Notice however that this will bind handler to the identifier and not the actual exception-handler. The
exception-handler can then be unregistered with:
[Link](handler)

This function is thread safe.


[Link](func)
Remove func from the collection of registered functions. If func isnt registered this is a no-op.

2.3 [Link] Replacement for atexit


Replacement for the Python standard librarys [Link].
Whereas the standard atexit module only defines [Link](), this replacement module also defines
unregister().
This module also fixes a the issue that exceptions raised by an exit handler is printed twice when the standard atexit
is used.
[Link](func, *args, **kwargs)
Registers a function to be called on program termination. The function will be called with positional arguments
args and keyword arguments kwargs, i.e. func(*args, **kwargs). The current context is recorded and
will be the one used when the handler is run.
E.g. to suppress logging output from an exit-handler one could write:
with [Link](log_level = error):
[Link](handler)

An identifier is returned which can be used to unregister the exit-handler.


This function can be used as a decorator:
@[Link]
def handler():
...

Notice however that this will bind handler to the identifier and not the actual exit-handler. The exit-handler
can then be unregistered with:
[Link](handler)

This function is thread safe.


[Link](ident)
Remove the exit-handler identified by ident from the list of registered handlers. If ident isnt registered this is a
no-op.

2.4 [Link] Easy access to header file constants


Module containing constants extracted from header files.
The purpose of this module is to provide quick access to constants from different architectures and operating systems.
20

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Example
>>> print [Link].SYS_stat
188
>>> print [Link].i386.SYS_stat
106
>>> print [Link].amd64.SYS_stat
4

The submodule freebsd contains all constants for FreeBSD, while the constants for Linux have been split up by
architecture.
The variables of the submodules will be lifted up by setting the [Link] or
[Link] in a manner similar to what happens in [Link].
Example
>>> with [Link](os = freebsd):
...
print constants.SYS_stat
188
>>> with [Link](os = linux, arch = i386):
...
print constants.SYS_stat
106
>>> with [Link](os = linux, arch = amd64):
...
print constants.SYS_stat
4

2.5 [Link] Setting runtime variables


[Link] = ContextType()
Global context object, used to store commonly-used pwntools settings. In most cases, the context is used
to infer default variables values. For example, [Link]() can take an os parameter as a keyword
argument. If it is not supplied, the os specified by context is used instead. Consider it a shorthand to passing
os= and arch= to every single function call.
class [Link](**kwargs)
Class for specifying information about the target machine. Intended for use as a pseudo-singleton through the
global variable [Link], available via from pwn import * as context.
The context is usually specified at the top of the Python file for clarity.
#!/usr/bin/env python
[Link](arch=i386, os=linux)

Currently supported properties and their defaults are listed below.


[Link].

The defaults are inherited from

Additionally, the context is thread-aware when using [Link] instead of


[Link] (all internal pwntools threads use the former).
The context is also scope-aware by using the with keyword.

2.5. [Link] Setting runtime variables

21

pwntools Documentation, Release 2.2

Examples
>>> [Link]()
>>> [Link](os=linux)
>>> [Link] == linux
True
>>> [Link] = arm
>>> vars(context) == {arch: arm, bits: 32, endian: little, os: linux}
True
>>> [Link]
little
>>> [Link]
32
>>> def nop():
...
print [Link](nop).encode(hex)
>>> nop()
00f020e3
>>> with [Link](arch = i386):
...
nop()
90
>>> from [Link] import Thread as PwnThread
>>> from threading
import Thread as NormalThread
>>> with [Link](arch = mips):
...
pwnthread = PwnThread(target=nop)
...
thread
= NormalThread(target=nop)
>>> # Normal thread uses the default value for arch, i386
>>> _=([Link](), [Link]())
90
>>> # Pwnthread uses the correct context from creation-time
>>> _=([Link](), [Link]())
00000000
>>> nop()
00f020e3

class Thread(*args, **kwargs)


Instantiates a context-aware thread, which inherit its context when it is instantiated. The class can be
accessed both on the context module as [Link] and on the context singleton object inside
the context module as [Link].
Threads created by using the native :[Link] will have a clean (default) context.
Regardless of the mechanism used to create any thread, the context is de-coupled from the parent thread,
so changes do not cascade to child or parent.
Saves a copy of the context when instantiated (at __init__) and updates the new threads context before
passing control to the user code via run or target=.
Examples
>>>
>>>
>>>
...
...
...
>>>
>>>

22

[Link]()
[Link](arch=arm)
def p():
print [Link]
[Link] = mips
print [Link]
# Note that a normal Thread starts with a clean context
# (i386 is the default architecture)

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> t = [Link](target=p)
>>> _=([Link](), [Link]())
i386
mips
>>> # Note that the main Threads context is unchanged
>>> print [Link]
arm
>>> # Note that a context-aware Thread receives a copy of the context
>>> t = [Link](target=p)
>>> _=([Link](), [Link]())
arm
mips
>>> # Again, the main thread is unchanged
>>> print [Link]
arm

Implementation Details:
This
class
implemented
by
hooking
the
private
function
[Link]._Thread_bootstrap(), which is called before passing control to [Link]().
This could be done by overriding run itself, but we would have to ensure that all uses of the
class would only ever use the keyword target= for __init__, or that all subclasses invoke
super([Link]).set_up_context() or similar.
ContextType.__call__(**kwargs)
Alias for [Link]()
[Link]
Target machine architecture.
Allowed values are listed in [Link].
Side Effects:
If an architecture is specified which also implies additional attributes (e.g. amd64 implies 64-bit
words, powerpc implies big-endian), these attributes will be set on the context if a user has not
already set a value.
The following properties may be modified.
bits
endian
Raises AttributeError An invalid architecture was specified
Examples
>>> [Link]()
>>> [Link] == i386 # Default architecture
True
>>> [Link] = mips
>>> [Link] == mips
True

2.5. [Link] Setting runtime variables

23

pwntools Documentation, Release 2.2

>>> [Link] = doge


Traceback (most recent call last):
...
AttributeError: arch must be one of [aarch64, ..., thumb]
Traceback (most recent call last):
...
AttributeError: arch must be one of [aarch64, ..., thumb]
>>> [Link] = ppc
>>> [Link] == powerpc # Aliased architecture
True
>>> [Link]()
>>> [Link] == 32 # Default value
True
>>> [Link] = amd64
>>> [Link] == 64 # New value
True

Note that expressly setting bits means that we use that value instead of the default
>>> [Link]()
>>> [Link] = 32
>>> [Link] = amd64
>>> [Link] == 32
True

Setting the architecture can override the defaults for both endian and bits
>>> [Link]()
>>> [Link] = powerpc64
>>> vars(context) == {arch: powerpc64, bits: 64, endian: big}
True

[Link] = OrderedDict([(powerpc64, {bits: 64, endian: big}), (aarch64, {bits: 64, end
Keys are valid values for [Link](). Values are defaults which are
set when [Link] is set
[Link]
Target machine word size, in bits (i.e. the size of general purpose registers).
The default value is 32, but changes according to arch.
Examples
>>> [Link]()
>>> [Link] == 32
True
>>> [Link] = 64
>>> [Link] == 64
True
>>> [Link] = -1
Traceback (most recent call last):
...
AttributeError: bits must be >= 0 (-1)
Traceback (most recent call last):
...
AttributeError: bits must be >= 0 (-1)

24

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link]
Target machine word size, in bytes (i.e. the size of general purpose registers).
This is a convenience wrapper around bits / 8.
Examples
>>> [Link] = 1
>>> [Link] == 8
True
>>> [Link] = 0
Traceback (most recent call last):
...
AttributeError: bits must be >= 0 (0)
Traceback (most recent call last):
...
AttributeError: bits must be >= 0 (0)

[Link]()
Clears the contents of the context. All values are set to their defaults.
Examples
>>> # Default value
>>> [Link] == i386
True
>>> [Link] = arm
>>> [Link] == i386
False
>>> [Link]()
>>> [Link] == i386
True

[Link]() dict
Returns a copy of the current context as a dictionary.
Examples
>>> [Link]()
>>> [Link]
= linux
>>> vars(context) == {os: linux}
True

[Link] = {newline: \n, arch: i386, log_level: 20, bits: 32, signed: False, timeout: 1048576
Default values for [Link]
[Link]
Endianness of the target machine.
The default value is little, but changes according to arch.
Raises AttributeError An invalid endianness was provided

2.5. [Link] Setting runtime variables

25

pwntools Documentation, Release 2.2

Examples
>>> [Link]()
>>> [Link] == little
True
>>> [Link] = big
>>> [Link]
big
>>> [Link] = be
>>> [Link] == big
True
>>> [Link] = foobar
Traceback (most recent call last):
...
AttributeError: endian must be one of [be, big, eb, el, le, little]
Traceback (most recent call last):
...
AttributeError: endian must be one of [be, big, eb, el, le, little]

[Link]
Legacy alias for endian.
Examples
>>> [Link] == [Link]
True

[Link] = OrderedDict([(little, little), (big, big), (el, little), (le, little), (be, big), (e
Valid values for endian
[Link](**kwargs) context manager
Create a context manager for use with the with statement.
For more information, see the example below or PEP 343.
Parameters kwargs Variables to be assigned in the new environment.
Returns ContextType manager for managing the old and new environment.
Examples
>>> [Link]()
>>> [Link] = 1
>>> [Link] == 1
True
>>> print [Link]
1.0
>>> with [Link](timeout = 2):
...
print [Link]
...
[Link] = 3
...
print [Link]
2.0
3.0

26

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> print [Link]


1.0

ContextType.log_level
Sets the verbosity of pwntools logging mechanism.
Valid values are specified by the standard Python logging module.
Default value is set to INFO.
Examples

>>> context.log_level = error


>>> context.log_level == [Link]
True
>>> context.log_level = 10
>>> context.log_level = foobar
Traceback (most recent call last):
...
AttributeError: log_level must be an integer or one of [CRITICAL, DEBUG, ERROR, INFO
Traceback (most recent call last):
...
AttributeError: log_level must be an integer or one of [CRITICAL, DEBUG, ERROR, INFO

[Link]
Operating system of the target machine.
The default value is linux.
Allowed values are listed in [Link].
Examples
>>> [Link] = linux
>>> [Link] = foobar
Traceback (most recent call last):
...
AttributeError: os must be one of [freebsd, linux, windows]
Traceback (most recent call last):
...
AttributeError: os must be one of [freebsd, linux, windows]

[Link] = [freebsd, linux, windows]


Valid values for [Link]()
ContextType.reset_local()
Deprecated. Use clear().
[Link]
Alias for signed
[Link]
Signed-ness for packing operation when its not explicitly set.
Can be set to any non-string truthy value, or the specific string values signed or unsigned which
are converted into True and False correspondingly.

2.5. [Link] Setting runtime variables

27

pwntools Documentation, Release 2.2

Examples

>>> [Link]
False
>>> [Link] = 1
>>> [Link]
True
>>> [Link] = signed
>>> [Link]
True
>>> [Link] = unsigned
>>> [Link]
False
>>> [Link] = foobar
Traceback (most recent call last):
...
AttributeError: signed must be one of [no, signed, unsigned, yes] or a non-string tr
Traceback (most recent call last):
...
AttributeError: signed must be one of [no, signed, unsigned, yes] or a non-string tr

[Link]
Alias for signed
[Link] = {yes: True, unsigned: False, signed: True, no: False}
Valid string values for signed
[Link]
Default amount of time to wait for a blocking operation before it times out, specified in seconds.
The default value is to have an infinite timeout.
See [Link] for additional information on valid values.
[Link](*args, **kwargs)
Convenience function, which is shorthand for setting multiple variables at once.
It is a simple shorthand such that:
[Link](os = linux, arch = arm, ...)

is equivalent to:
[Link]
= linux
[Link] = arm
...

The following syntax is also valid:


[Link]({os: linux, arch: arm})

Parameters kwargs Variables to be assigned in the environment.


Examples
>>> [Link]()
>>> [Link](arch = i386, os = linux)
>>> [Link], [Link]
(i386, linux)

28

Chapter 2. Module Index

pwntools Documentation, Release 2.2

ContextType.word_size
Alias for bits
class [Link](*args, **kwargs)
Instantiates a context-aware thread, which inherit its context when it is instantiated. The class can be accessed
both on the context module as [Link] and on the context singleton object inside the context
module as [Link].
Threads created by using the native :[Link] will have a clean (default) context.
Regardless of the mechanism used to create any thread, the context is de-coupled from the parent thread, so
changes do not cascade to child or parent.
Saves a copy of the context when instantiated (at __init__) and updates the new threads context before
passing control to the user code via run or target=.
Examples
>>> [Link]()
>>> [Link](arch=arm)
>>> def p():
...
print [Link]
...
[Link] = mips
...
print [Link]
>>> # Note that a normal Thread starts with a clean context
>>> # (i386 is the default architecture)
>>> t = [Link](target=p)
>>> _=([Link](), [Link]())
i386
mips
>>> # Note that the main Threads context is unchanged
>>> print [Link]
arm
>>> # Note that a context-aware Thread receives a copy of the context
>>> t = [Link](target=p)
>>> _=([Link](), [Link]())
arm
mips
>>> # Again, the main thread is unchanged
>>> print [Link]
arm

Implementation Details:
This class implemented by hooking the private function [Link]._Thread_bootstrap(),
which is called before passing control to [Link]().
This could be done by overriding run itself, but we would have to ensure that all uses of the
class would only ever use the keyword target= for __init__, or that all subclasses invoke
super([Link]).set_up_context() or similar.

2.6 [Link] Resolving remote functions using leaks


Resolve symbols in loaded, dynamically-linked ELF binaries. Given a function which can leak data at an arbitrary
address, any symbol in any loaded library can be resolved.

2.6. [Link] Resolving remote functions using leaks

29

pwntools Documentation, Release 2.2

2.6.1 Example
# Assume a process or remote connection
p = process(./pwnme)
# Declare a function that takes a single address, and
# leaks at least one byte at that address.
def leak(address):
data = [Link](address, 4)
[Link]("%#x => %s" % (address, (data or ).encode(hex)))
return data
# For the sake of this example, lets say that we
# have any of these pointers. One is a pointer into
# the target binary, the other two are pointers into libc
main
= 0xfeedf4ce
libc
= 0xdeadb000
system = 0xdeadbeef
# With our leaker, and a pointer into our target binary,
# we can resolve the address of anything.
#
# We do not actually need to have a copy of the target
# binary for this to work.
d = DynELF(leak, main)
assert [Link](None,
libc) == libc
assert [Link](system, libc) == system
# However, if we *do* have a copy of the target binary,
# we can speed up some of the steps.
d = DynELF(leak, main, elf=ELF(./pwnme))
assert [Link](None,
libc) == libc
assert [Link](system, libc) == system
# Alternately, we can resolve symbols inside another library,
# given a pointer into it.
d = DynELF(leak, libc + 0x1234)
assert [Link](system)
== system

DynELF
class [Link](leak, pointer=None, elf=None)
DynELF knows how to resolve symbols in remote processes via an infoleak or memleak vulnerability encapsulated by [Link].
Implementation Details:
Resolving Functions:
In all ELFs which export symbols for importing by other libraries, (e.g. [Link]) there
are a series of tables which give exported symbol names, exported symbol addresses, and
the hash of those exported symbols. By applying a hash function to the name of the desired
symbol (e.g., printf), it can be located in the hash table. Its location in the hash table
provides an index into the string name table (strtab), and the symbol address (symtab).
Assuming we have the base address of [Link], the way to resolve the address of
printf is to locate the symtab, strtab, and hash table. The string "printf" is
hashed according to the style of the hash table (SYSV or GNU), and the hash table is
walked until a matching entry is located. We can verify an exact match by checking the

30

Chapter 2. Module Index

pwntools Documentation, Release 2.2

string table, and then get the offset into [Link] from the symtab.
Resolving Library Addresses:
If we have a pointer into a dynamically-linked executable, we can leverage an internal linker
structure called the link map. This is a linked list structure which contains information about
each loaded library, including its full path and base address.
A pointer to the link map can be found in two ways. Both are referenced from entries in
the DYNAMIC array.
In non-RELRO binaries, a pointer is placed in the .[Link] area in the binary. This is
marked by finding the DT_PLTGOT_ area in the binary.
In all binaries, a pointer can be found in the area described by the DT_DEBUG area.
This exists even in stripped binaries.
For maximum flexibility, both mechanisms are used exhaustively.
bases()
Resolve base addresses of all loaded libraries.
Return a dictionary mapping library path to its base address.
dynamic
Returns Pointer to the .DYNAMIC area.
elfclass
32 or 64
static find_base(leak, ptr)
Given a [Link] object and a pointer into a library, find its base address.
link_map
Pointer to the runtime link_map object
lookup(symb = None, lib = None) int
Find the address of symbol, which is found in lib.
Parameters
symb (str) Named routine to look up
lib (str) Substring to match for the library name. If omitted, the current library is
searched. If set to libc, [Link] is assumed.
Returns Address of the named symbol, or None.
[Link].gnu_hash(str) int
Function used to generated GNU-style hashes for strings.
[Link].sysv_hash(str) int
Function used to generate SYSV-style hashes for strings.

2.7 [Link] Working with ELF binaries


Exposes functionality for manipulating ELF files
[Link](*args, **kwargs)
Compatibility wrapper for pwntools v1

2.7. [Link] Working with ELF binaries

31

pwntools Documentation, Release 2.2

class [Link](path)
Encapsulates information about an ELF file.
Variables
path Path to the binary on disk
symbols Dictionary of {name: address} for all symbols in the ELF
plt Dictionary of {name: address} for all functions in the PLT
got Dictionary of {name: address} for all function pointers in the GOT
libs Dictionary of {path: address} for each shared object required to load the ELF
Example:
bash = ELF(which(bash))
hex([Link][read])
# 0x41dac0
hex([Link][read])
# 0x41dac0
u32([Link]([Link][read], 4))
# 0x41dac6
print disasm([Link]([Link][read],16), arch=amd64)
# 0:
ff 25 1a 18 2d 00
jmp
QWORD PTR [rip+0x2d181a]
# 6:
68 59 00 00 00
push
0x59
# b:
e9 50 fa ff ff
jmp
0xfffffffffffffa60

# 0x2d1820

address
Address of the lowest segment loaded in the ELF. When updated, cascades updates to segment vaddrs,
section addrs, symbols, plt, and got.
>>> bash = ELF(which(bash))
>>> old = [Link][read]
>>> [Link] += 0x1000
>>> [Link][read] == old + 0x1000
True

asm(address, assembly)
Assembles the specified instructions and inserts them into the ELF at the specified address.
The resulting binary can be saved with [Link]()
bss(offset=0)
Returns an index into the .bss segment
disasm(address, n_bytes)
Returns a string of disassembled instructions at the specified virtual memory address
dwarf
DWARF info for the elf
elfclass
ELF class (32 or 64).
Note: Set during ELFFile._identify_file
elftype
ELF type (EXEC, DYN, etc)
entry
Entry point to the ELF
32

Chapter 2. Module Index

pwntools Documentation, Release 2.2

entrypoint
Entry point to the ELF
executable_segments
Returns: list of all segments which are executable.
get_data()
Retrieve the raw data from the ELF file.
>>> bash = ELF(which(bash))
>>> fd
= open(which(bash))
>>> bash.get_data() == [Link]()
True

non_writable_segments
Returns: list of all segments which are NOT writeable
offset_to_vaddr(offset)
Translates the specified offset to a virtual address.
Parameters offset (int) Offset to translate
Returns Virtual address which corresponds to the file offset, or None
Examples
>>> bash = ELF(which(bash))
>>> [Link] == bash.offset_to_vaddr(0)
True
>>> [Link] += 0x123456
>>> [Link] == bash.offset_to_vaddr(0)
True

read(address, count)
Read data from the specified virtual address
Parameters
address (int) Virtual address to read
count (int) Number of bytes to read
Returns A string of bytes, or None
Examples
>>> bash = ELF(which(bash))
>>> [Link]([Link]+1, 3)
ELF

save(path)
Save the ELF to a file
>>> bash = ELF(which(bash))
>>> [Link](/tmp/bash_copy)
>>> copy = file(/tmp/bash_copy)
>>> bash = file(which(bash))
>>> [Link]() == [Link]()
True

2.7. [Link] Working with ELF binaries

33

pwntools Documentation, Release 2.2

search(needle, writable = False) str generator


Search the ELFs virtual address space for the specified string.
Parameters
needle (str) String to search for.
writable (bool) Search only writable sections.
Returns An iterator for each virtual address that matches.
Examples
>>> bash = ELF(which(bash))
>>> [Link] + 1 == next([Link](ELF))
True
>>> sh = ELF(which(bash))
>>> # /bin/sh should only depend on libc
>>> libc_path = [key for key in [Link]() if libc in key][0]
>>> libc = ELF(libc_path)
>>> # this string should be in there because of system(3)
>>> len(list([Link](/bin/sh))) > 0
True

section(name)
Gets data for the named section
Parameters name (str) Name of the section
Returns String containing the bytes for that section
sections
A list of all sections in the ELF
segments
A list of all segments in the ELF
start
Entry point to the ELF
vaddr_to_offset(address)
Translates the specified virtual address to a file address
Parameters address (int) Virtual address to translate
Returns Offset within the ELF file which corresponds to the address, or None.
Examples
>>> bash = ELF(which(bash))
>>> 0 == bash.vaddr_to_offset([Link])
True
>>> [Link] += 0x123456
>>> 0 == bash.vaddr_to_offset([Link])
True

writable_segments
Returns: list of all segments which are writeable

34

Chapter 2. Module Index

pwntools Documentation, Release 2.2

write(address, data)
Writes data to the specified virtual address
Parameters
address (int) Virtual address to write
data (str) Bytes to write
Note: This routine does not check the bounds on the write to ensure that it stays in the same segment.

Examples
>>> bash = ELF(which(bash))
>>> [Link]([Link]+1, 3)
ELF
>>> [Link]([Link], "HELO")
>>> [Link]([Link], 4)
HELO

2.8 [Link] Pwnlib exceptions


exception [Link](msg, reason=None, exit_code=None)
Exception thrown by [Link]().
Pwnlib functions that encounters unrecoverable errors should call the [Link]() function instead of throwing this exception directly.

2.9 [Link] Working with GDB


[Link](target, execute = None, exe = None, arch = None) None
Start GDB in a new terminal and attach to target. [Link]() is used to find the PID of
target except when target is a (host, port)-pair. In that case target is assumed to be a GDB server.
If it is running locally and exe is not given we will try to find the path of the target binary from parsing the
command line of the program running the GDB server (e.g. qemu or gdbserver). Notice that if the PID is known
(when target is not a GDB server) exe will be read from /proc/<pid>/exe.
If gdb-multiarch is installed we use that or gdb otherwise.
Parameters
target The target to attach to.
execute (str or file) GDB script to run after attaching.
exe (str) The path of the target binary.
arch (str) Architechture of the target binary. If exe known GDB will
Returns None
[Link](args) tube
Launch a GDB server with the specified command line, and launches GDB to attach to it.
Parameters

2.8. [Link] Pwnlib exceptions

35

pwntools Documentation, Release 2.2

args Same args as passed to [Link]


ssh Remote ssh session to use to launch the process. Automatically sets up port forwarding
so that gdb runs locally.
Returns A tube connected to the target process
[Link].find_module_addresses(binary, ssh=None, ulimit=False)
Cheat to find modules by using GDB.
We cant use /proc/$pid/map since some servers forbid it. This breaks info proc in GDB, but info
sharedlibrary still works. Additionally, info sharedlibrary works on FreeBSD, which may not
have procfs enabled or accessible.
The output looks like this:
info proc mapping
process 13961
warning: unable to open /proc file /proc/13961/maps
info sharedlibrary
From
To
Syms Read
Shared Object Library
0xf7fdc820 0xf7ff505f Yes (*)
/lib/[Link].2
0xf7fbb650 0xf7fc79f8 Yes
/lib32/[Link].0
0xf7e26f10 0xf7f5b51c Yes (*)
/lib32/[Link].6
(*): Shared library is missing debugging information.

Note that the raw addresses provided by info sharedlibrary are actually the address of the .text
segment, not the image base address.
This routine automates the entire process of:
[Link] the binaries from the remote server
[Link] GDB for the information
[Link] each library into an ELF
[Link] up the base address vs. the .text segment address
Parameters
binary (str) Path to the binary on the remote server
ssh ([Link]) SSH connection through which to load the libraries. If left as
None, will use a [Link].
ulimit (bool) Set to True to run ulimit -s unlimited before GDB.
Returns A list of [Link] objects, with correct base addresses.
Example:
>>> with [Link](log_level=9999):
...
shell = ssh(host=[Link],user=bandit0,password=bandit0)
...
bash_libs = gdb.find_module_addresses(/bin/bash, shell)
>>> [Link](bash_libs[0].path)
[Link].6
>>> hex(bash_libs[0].symbols[system])
0x7ffff7634660

36

Chapter 2. Module Index

pwntools Documentation, Release 2.2

2.10 [Link] and Logging stuff


Logging module for printing status during an exploit, and internally within pwntools.

2.10.1 Exploit Developers


By using the standard from pwn import *, an object named log will be inserted into the global namespace. You
can use this to print out status messages during exploitation.
For example,:
[Link](Hello, world!)

prints:
[*] Hello, world!

Additionally, there are some nifty mechanisms for performing status updates on a running job (e.g. when bruteforcing).:
p = [Link](Working)
[Link](Reticulating splines)
[Link](1)
[Link](Got a shell!)

The verbosity of logging can be most easily controlled by setting context.log_level on the global context
object.:
[Link]("No you see me")
context.log_level = error
[Link]("Now you dont")

2.10.2 Pwnlib Developers


A module-specific logger can be imported into the module via:
log = [Link](__name__)

This provides an easy way to filter logging programmatically or via a configuration file for debugging.
Theres no need to expressly import this log module.
When using progress, you should use the with keyword to manage scoping, to ensure the spinner stops if an
exception is thrown.
class [Link](*args, **kwargs)
Specialization of [Link] which uses [Link].log_level to infer verbosity.
Also adds some pwnlib flavor via:
progress()
success()
failure()
indented()

2.10. [Link] and Logging stuff

37

pwntools Documentation, Release 2.2

Adds pwnlib-specific information for coloring and indentation to the log records passed to the
[Link].
Internal:
Permits prepending a string to each message, by means of msg_prefix. This is leveraged for
progress messages.
debug(message)
Logs a debug message.
error(message)
To be called outside an exception handler.
Logs an error message, then raises a PwnlibException.
failure(message)
Logs a failure message. If the Logger is animated, the animation is stopped.
indented(message, level=[Link])
Log an info message without the line prefix.
Parameters level (int) Alternate log level at which to set the indented message.
info(message)
Logs an info message.
info_once(message)
Logs an info message. The same message is never printed again.
progress(self ) Logger
Creates a Logger with a progress animation, which can be stopped via success(), and failure().
The Logger returned is also a scope manager. Using scope managers ensures that the animation is
stopped, even if an exception is thrown.
::
with [Link](Trying something...) as p:
for i in range(10): [Link](At %i % i) [Link](0.5)
x = 1/0
success(message)
Logs a success message. If the Logger is animated, the animation is stopped.
warn(message)
Logs a warning message.
warn_once(message)
Logs a warning message. The same message is never printed again.

2.11 [Link] Helper class for leaking memory


class [Link](f, search_range=20, reraise=True)
MemLeak is a caching and heuristic tool for exploiting memory leaks.
It can be used as a decorator, around functions of the form:
def some_leaker(addr): ... return data_as_string_or_None

38

Chapter 2. Module Index

pwntools Documentation, Release 2.2

It will cache leaked memory (which requires either non-randomized static data or a continouous session). If
required, dynamic or known data can be set with the set-functions, but this is usually not required. If a byte
cannot be recovered, it will try to leak nearby bytes in the hope that the byte is recovered as a side-effect.
Parameters
f (function) The leaker function.
search_range (int) How many bytes to search backwards in case an address does not
work.
reraise (bool) Whether to reraise call [Link]() in case the leaker
function throws an exception.
Example
>>> import pwnlib
>>> binsh = [Link](/bin/sh)
>>> @[Link]
... def leaker(addr):
...
print "leaking 0x%x" % addr
...
return binsh[addr:addr+4]
>>> leaker.s(0)[:4]
leaking 0x0
leaking 0x4
\x7fELF
>>> hex(leaker.d(0))
0x464c457f
>>> hex([Link](1))
0x45
>>> hex(leaker.d(0))
leaking 0x1
0x464c457f

b(addr, ndx = 0) int


Leak byte at ((uint8_t*) addr)[ndx]
Examples
>>> import string
>>> data = string.ascii_lowercase
>>> l = MemLeak(lambda a: data[a:a+2], reraise=False)
>>> l.b(0) == ord(a)
True
>>> l.b(25) == ord(z)
True
>>> l.b(26) is None
True

clearb(addr, ndx = 0) int


Clears byte at ((uint8_t*)addr)[ndx] from the cache and returns the removed value or None if the
address was not completely set.

2.11. [Link] Helper class for leaking memory

39

pwntools Documentation, Release 2.2

Examples
>>> l = MemLeak(lambda a: None)
>>> [Link] = {0:a}
>>> l.n(0,1) == a
True
>>> [Link](0) == unpack(a, 8)
True
>>> [Link]
{}
>>> [Link](0) is None
True

cleard(addr, ndx = 0) int


Clears dword at ((uint32_t*)addr)[ndx] from the cache and returns the removed value or None
if the address was not completely set.
Examples
>>> l = MemLeak(lambda a: None)
>>> [Link] = {0:a, 1: b, 2: c, 3: d}
>>> l.n(0, 4) == abcd
True
>>> [Link](0) == unpack(abcd, 32)
True
>>> [Link]
{}

clearq(addr, ndx = 0) int


Clears qword at ((uint64_t*)addr)[ndx] from the cache and returns the removed value or None
if the address was not completely set.
Examples
>>> c = MemLeak(lambda addr: )
>>> [Link] = {x:x for x in range(0x100, 0x108)}
>>> [Link](0x100) == unpack(xxxxxxxx, 64)
True
>>> [Link] == {}
True

clearw(addr, ndx = 0) int


Clears word at ((uint16_t*)addr)[ndx] from the cache and returns the removed value or None if
the address was not completely set.
Examples
>>> l = MemLeak(lambda a: None)
>>> [Link] = {0:a, 1: b}
>>> l.n(0, 2) == ab
True
>>> [Link](0) == unpack(ab, 16)
True

40

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> [Link]
{}

d(addr, ndx = 0) int


Leak dword at ((uint32_t*) addr)[ndx]
Examples
>>> import string
>>> data = string.ascii_lowercase
>>> l = MemLeak(lambda a: data[a:a+8], reraise=False)
>>> l.d(0) == unpack(abcd, 32)
True
>>> l.d(22) == unpack(wxyz, 32)
True
>>> l.d(23) is None
True

field(address, obj)
call(address, field) => int or str
Leak an entire structure, or structure field.
Parameters
address (int) Base address to calculate offsets from
field (obj) Instance of a ctypes field
Return Value: The type of the return value will be dictated by the type of field.
n(addr, ndx = 0) str
Leak numb bytes at addr.
Returns A string with the leaked bytes, will return None if any are missing
Examples
>>> import string
>>> data = string.ascii_lowercase
>>> l = MemLeak(lambda a: data[a:a+4], reraise=False)
>>> l.n(0,1) == a
True
>>> l.n(0,26) == data
True
>>> len(l.n(0,26)) == 26
True
>>> l.n(0,27) is None
True

q(addr, ndx = 0) int


Leak qword at ((uint64_t*) addr)[ndx]

2.11. [Link] Helper class for leaking memory

41

pwntools Documentation, Release 2.2

Examples
>>> import string
>>> data = string.ascii_lowercase
>>> l = MemLeak(lambda a: data[a:a+16], reraise=False)
>>> l.q(0) == unpack(abcdefgh, 64)
True
>>> l.q(18) == unpack(stuvwxyz, 64)
True
>>> l.q(19) is None
True

raw(addr, numb) list


Leak numb bytes at addr
s(addr) str
Leak bytes at addr until failure or a nullbyte is found
Returns A string, without a NULL terminator. The returned string will be empty if the first byte
is a NULL terminator, or if the first byte could not be retrieved.
Examples
>>> data = "Hello\x00World"
>>> l = MemLeak(lambda a: data[a:a+4], reraise=False)
>>> l.s(0) == "Hello"
True
>>> l.s(5) == ""
True
>>> l.s(6) == "World"
True
>>> l.s(999) == ""
True

setb(addr, val, ndx=0)


Sets byte at ((uint8_t*)addr)[ndx] to val in the cache.
Examples
>>> l = MemLeak(lambda x: )
>>> [Link] == {}
True
>>> [Link](33, 0x41)
>>> [Link] == {33: A}
True

setd(addr, val, ndx=0)


Sets dword at ((uint32_t*)addr)[ndx] to val in the cache.
Examples

See setw().
setq(addr, val, ndx=0)
Sets qword at ((uint64_t*)addr)[ndx] to val in the cache.
42

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Examples

See setw().
sets(addr, val, null_terminate=True)
Set known string at addr, which will be optionally be null-terminated
Note that this method is a bit dumb about how it handles the data. It will null-terminate the data, but it will
not stop at the first null.
Examples
>>> l = MemLeak(lambda x: )
>>> [Link] == {}
True
>>> [Link](0, H\x00ello)
>>> [Link] == {0: H, 1: \x00, 2: e, 3: l, 4: l, 5: o, 6: \x00}
True

setw(addr, val, ndx=0)


Sets word at ((uint16_t*)addr)[ndx] to val in the cache.
Examples
>>> l = MemLeak(lambda x: )
>>> [Link] == {}
True
>>> [Link](33, 0x41)
>>> [Link] == {33: A, 34: \x00}
True

w(addr, ndx = 0) int


Leak word at ((uint16_t*) addr)[ndx]
Examples
>>> import string
>>> data = string.ascii_lowercase
>>> l = MemLeak(lambda a: data[a:a+4], reraise=False)
>>> l.w(0) == unpack(ab, 16)
True
>>> l.w(24) == unpack(yz, 16)
True
>>> l.w(25) is None
True

2.12 [Link] Replacements for various functions


Improved replacements for standard functions
[Link](n)
Replacement for [Link](), which does not return if a signal is recieved.

2.12. [Link] Replacements for various functions

43

pwntools Documentation, Release 2.2

Parameters n (int) Number of seconds to sleep.

2.13 [Link] Return Oriented Programming


Return Oriented Programming
class [Link](elfs, base=None)
Class which simplifies the generation of ROP-chains.
Example:
elf = ELF(ropasaurusrex)
rop = ROP(elf)
[Link](0, [Link](0x80))
[Link]()
# [0x0000:
0x80482fc (read),
# 0x0004:
0xdeadbeef,
# 0x0008:
0x0,
# 0x000c:
0x80496a8]
str(rop)
# \xfc\x82\x04\x08\xef\xbe\xad\xde\x00\x00\x00\x00\xa8\x96\x04\x08

__getattr__(attr)
Helper to make finding ROP gadets easier.
Also provides a shorthand for .call(): [Link](args) ==> [Link](function,
args)
>>> elf=ELF(which(bash))
>>> rop=ROP([elf])
>>> [Link]
== [Link](regs=[rdi], order = regs)
True
>>> rop.r13_r14_r15_rbp == [Link](regs=[r13,r14,r15,rbp], order = regs)
True
>>> [Link]
== [Link](move=[Link])
True
>>> rop.ret_8
== [Link](move=8)
True
>>> [Link]
!= None
True

__str__()
Returns: Raw bytes of the ROP chain
build(base=None)
Build the ROP chain into a list (addr, int/string, bool), where the last value is True iff the value was an
internal reference.
It is guaranteed that the individual parts are next to each other.
If there is no base available, then the returned addresses are indexed from 0.
Parameters base (int) The base address to build the rop-chain from. Defaults to [Link].
call(resolvable, arguments=())
Add a call to the ROP chain
Parameters
resolvable (str,int) Value which can be looked up via resolve, or is already an integer.

44

Chapter 2. Module Index

pwntools Documentation, Release 2.2

arguments (list) List of arguments which can be passed to pack(). Alternately, if a base
address is set, arbitrarily nested structures of strings or integers can be provided.
chain()
Build the ROP chain
Returns str containging raw ROP bytes
dump()
Dump the ROP chain in an easy-to-read manner
migrate(next_base)
Explicitly set $sp, by using a leave; ret gadget
raw(value)
Adds a raw integer or string to the ROP chain.
If your architecture requires aligned values, then make sure that any given string is aligned!
Parameters data (int/str) The raw value to put onto the rop chain.
resolve(resolvable)
Resolves a symbol to an address
Parameters resolvable (str,int) Thing to convert into an address
Returns int containing address of resolvable, or None
search(move=0, regs=None, order=size)
Search for a gadget which matches the specified criteria.
Parameters
move (int) Minimum number of bytes by which the stack pointer is adjusted.
regs (list) Minimum list of registers which are popped off the stack.
order (str) Either the string size or regs. Decides how to order multiple gadgets the
fulfill the requirements.
The search will try to minimize the number of bytes popped more than requested, the number of registers
touched besides the requested and the address.
If order == size, then gadgets are compared lexicographically by (total_moves,
total_regs, addr), otherwise by (total_regs, total_moves, addr).
Returns A tuple of (address, info) in the same format as [Link]().
unresolve(value)
Inverts resolve. Given an address, it attempts to find a symbol for it in the loaded ELF files. If none is
found, it searches all known gadgets, and returns the disassembly
Parameters value (int) Address to look up
Returns String containing the symbol name for the address, disassembly for a gadget (if theres
one at that address), or an empty string.

2.14 [Link] Shellcode generation


The shellcode module.
This module contains functions for generating shellcode.
It is organized first by architecture and then by operating system.
2.14. [Link] Shellcode generation

45

pwntools Documentation, Release 2.2

Example
>>> print [Link]().strip(\n)
nop
>>> print [Link]()
/* push /bin///sh\x00 */
push 0x68
push 0x732f2f2f
push 0x6e69622f
...

2.14.1 Submodules
[Link].amd64 Shellcode for AMD64
[Link].amd64

Shellcraft module containing generic Intel x86_64 shellcodes.


[Link]()
A two-byte infinite loop.
[Link](dest, src, stack_allowed=True)
Move src into dest without newlines and null bytes.
If the src is a register smaller than the dest, then it will be zero-extended to fit inside the larger register.
If the src is a register larger than the dest, then only some of the bits will be used.
Example
>>> print [Link](eax,ebx).rstrip()
mov eax, ebx
>>> print [Link](eax, 0).rstrip()
xor eax, eax
>>> print [Link](ax, 0).rstrip()
xor ax, ax
>>> print [Link](rax, 0).rstrip()
xor eax, eax
>>> print [Link](al, ax).rstrip()
/* moving ax into al, but this is a no-op */
>>> print [Link](bl, ax).rstrip()
mov bl, al
>>> print [Link](ax, bl).rstrip()
movzx ax, bl
>>> print [Link](eax, 1).rstrip()
push 0x1
pop rax
>>> print [Link](rax, 0xdead00ff).rstrip()
mov eax, 0x1010101
xor eax, 0xdfac01fe
>>> print [Link](rax, 0x11dead00ff).rstrip()
mov rax, 0x101010101010101
push rax
mov rax, 0x1010110dfac01fe

46

Chapter 2. Module Index

pwntools Documentation, Release 2.2

xor [rsp], rax


pop rax

Parameters
dest (str) The destination register.
src (str) Either the input register, or an immediate value.
stack_allowed (bool) Can the stack be used?
[Link]()
A single-byte nop instruction.
[Link](value)
Pushes a value onto the stack without using null bytes or newline characters.
Parameters value (int,str) The value or register to push
[Link](string, append_null=True)
Pushes a string onto the stack without using null bytes or newline characters.
Example
>>> print [Link]().rstrip()
/* push \x00 */
push 1
dec byte ptr [rsp]
>>> print [Link](a).rstrip()
/* push a\x00 */
push 0x61
>>> print [Link](aa).rstrip()
/* push aa\x00 */
push 0x...
xor dword ptr [rsp], 0x...
>>> print [Link](aaa).rstrip()
/* push aaa\x00 */
push 0x...
xor dword ptr [rsp], 0x...
>>> print [Link](aaaa).rstrip()
/* push aaaa\x00 */
push 0x61616161
>>> print [Link](aaa\xc3).rstrip()
/* push aaa\xc3\x00 */
push 0x...
xor dword ptr [rsp], 0x...
>>> print [Link](aaa\xc3, append_null = False).rstrip()
/* push aaa\xc3 */
push 0x...
>>> print [Link](\xc3).rstrip()
/* push \xc3\x00 */
push 0x...
xor dword ptr [rsp], 0x...
>>> print [Link](\xc3, append_null = False).rstrip()
/* push \xc3 */
push 0x...c3
>>> with [Link]():
...
[Link] = amd64

2.14. [Link] Shellcode generation

47

pwntools Documentation, Release 2.2

...
print enhex(asm([Link]("/bin/sh")))
48b801010101010101015048b82e63686f2e72690148310424
>>> with [Link]():
...
[Link] = amd64
...
print enhex(asm([Link]("")))
6a01fe0c24
>>> with [Link]():
...
[Link] = amd64
...
print enhex(asm([Link]("\x00", False)))
6a01fe0c24

Parameters
string (str) The string to push.
append_null (bool) Whether to append a single NULL-byte before pushing.
[Link](return_value=None)
A single-byte RET instruction.
Parameters return_value Value to return
[Link]()
A trap instruction.
[Link]

Shellcraft module containing Intel x86_64 shellcodes for Linux.


[Link](sock=rbp)
Args: [sock (imm/reg) = rbp] Duplicates sock to stdin, stdout and stderr
[Link](sock=rbp)
Args: [sock (imm/reg) = rbp] Duplicates sock to stdin, stdout and stderr and spawns a shell.
[Link](string, sock=rbp)
Writes a string to a file descriptor
[Link](gid=egid)
Args: [gid (imm/reg) = egid] Sets the real and effective group id.
[Link](uid=euid)
Args: [uid (imm/reg) = euid] Sets the real and effective user id.
[Link]()
Execute /bin/sh
[Link](syscall=None, arg0=None, arg1=None, arg2=None,
arg3=None, arg4=None, arg5=None)
Args: [syscall_number, *args] Does a syscall
Example
>>> print [Link](SYS_execve, 1, rsp, 2, 0).rstrip()
/* call execve(1, rsp, 2, 0) */
push 0x1
pop rdi

48

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>>

>>>

>>>

>>>

mov rsi, rsp


push 0x2
pop rdx
xor r10d, r10d
push 0x3b
pop rax
syscall
print [Link](SYS_execve, 2, 1, 0, -1).rstrip()
/* call execve(2, 1, 0, -1) */
push 0x2
pop rdi
push 0x1
pop rsi
push -1
pop r10
push 0x3b
pop rax
cdq /* Set rdx to 0, rax is known to be positive */
syscall
print [Link]().rstrip()
/* call syscall() */
syscall
print [Link](rax, rdi, rsi).rstrip()
/* call syscall(rax, rdi, rsi) */
/* moving rdi into rdi, but this is a no-op */
/* moving rsi into rsi, but this is a no-op */
/* moving rax into rax, but this is a no-op */
syscall
print [Link](rbp, None, None, 1).rstrip()
/* call syscall(rbp, ?, ?, 1) */
push 0x1
pop rdx
mov rax, rbp
syscall

[Link] Shellcode for ARM


[Link]

Shellcraft module containing generic ARM little endian shellcodes.


[Link]()
An infinite loop.
[Link](dst, src)
Returns THUMB code for moving the specified source value into the specified destination register.
[Link]()
A nop instruction.
[Link](return_value=None)
A single-byte RET instruction.
Parameters return_value Value to return

2.14. [Link] Shellcode generation

49

pwntools Documentation, Release 2.2

Examples
>>> with [Link](arch=arm):
...
print enhex(asm([Link]()))
...
print enhex(asm([Link](0)))
...
print enhex(asm([Link](0xdeadbeef)))
1eff2fe1
000020e01eff2fe1
ef0e0be3ad0e4de31eff2fe1

[Link].to_thumb()
Go from ARM to THUMB mode.
[Link]

Shellcraft module containing ARM shellcodes for Linux.


[Link](egg, start_address = 0, double_check = True)
Searches for an egg, which is either a four byte integer or a four byte string. The egg must appear twice in a
row if double_check is True. When the egg has been found the egghunter branches to the address following it.
If start_address has been specified search will start on the first address of the page that contains that address.
[Link].open_file(filepath, flags=O_RDONLY, mode=420)
Opens a file. Leaves the file descriptor in r0.
Parameters
filepath (str) The file to open.
flags (int/str) The flags to call open with.
mode (int/str) The attribute to create the flag. Only matters of flags & O_CREAT is
set.
[Link]()
Execute /bin/sh
[Link] Shellcode common to all architecture
Shellcraft module containing shellcode common to all platforms.
[Link](prefix=label)
Returns a new unique label with a given prefix.
Parameters prefix (str) The string to prefix the label with
[Link].i386 Shellcode for Intel 80386
[Link].i386

Shellcraft module containing generic Intel i386 shellcodes.


[Link]()
A single-byte breakpoint instruction.
[Link]()
A two-byte infinite loop.

50

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link](dest, src, stack_allowed=True)


Move src into dest without newlines and null bytes.
If the src is a register smaller than the dest, then it will be zero-extended to fit inside the larger register.
If the src is a register larger than the dest, then only some of the bits will be used.
Example
>>> print [Link](eax,ebx).rstrip()
mov eax, ebx
>>> print [Link](eax, 0).rstrip()
xor eax, eax
>>> print [Link](ax, 0).rstrip()
xor ax, ax
>>> print [Link](ax, 17).rstrip()
push 0x11
pop ax
inc esp
inc esp
>>> print [Link](al, ax).rstrip()
/* moving ax into al, but this is a no-op */
>>> print [Link](bl, ax).rstrip()
mov bl, al
>>> print [Link](ax, bl).rstrip()
movzx ax, bl
>>> print [Link](eax, 1).rstrip()
push 0x1
pop eax
>>> print [Link](eax, 0xdead00ff).rstrip()
mov eax, 0x1010101
xor eax, 0xdfac01fe

Parameters
dest (str) The destination register.
src (str) Either the input register, or an immediate value.
stack_allowed (bool) Can the stack be used?
[Link]()
A single-byte nop instruction.
[Link](value)
Pushes a value onto the stack without using null bytes or newline characters.
Parameters value (int,str) The value or register to push
[Link](string, append_null=True)
Pushes a string onto the stack without using null bytes or newline characters.
Example
>>> print [Link]().rstrip()
/* push \x00 */
push 1

2.14. [Link] Shellcode generation

51

pwntools Documentation, Release 2.2

dec byte ptr [esp]


>>> print [Link](a).rstrip()
/* push a\x00 */
push 0x61
>>> print [Link](aa).rstrip()
/* push aa\x00 */
push 0x1010101
xor dword ptr [esp], 0x1016060
>>> print [Link](aaa).rstrip()
/* push aaa\x00 */
push 0x1010101
xor dword ptr [esp], 0x1606060
>>> print [Link](aaaa).rstrip()
/* push aaaa\x00 */
push 1
dec byte ptr [esp]
push 0x61616161
>>> print [Link](aaaaa).rstrip()
/* push aaaaa\x00 */
push 0x61
push 0x61616161
>>> print [Link](aaaa, append_null = False).rstrip()
/* push aaaa */
push 0x61616161
>>> print [Link](\xc3).rstrip()
/* push \xc3\x00 */
push 0x1010101
xor dword ptr [esp], 0x10101c2
>>> print [Link](\xc3, append_null = False).rstrip()
/* push \xc3 */
push 0x...c3
>>> with [Link]():
...
[Link] = i386
...
print enhex(asm([Link]("/bin/sh")))
68010101018134242e726901682f62696e
>>> with [Link]():
...
[Link] = i386
...
print enhex(asm([Link]("")))
6a01fe0c24
>>> with [Link]():
...
[Link] = i386
...
print enhex(asm([Link]("\x00", False)))
6a01fe0c24

Parameters
string (str) The string to push.
append_null (bool) Whether to append a single NULL-byte before pushing.
[Link](return_value=None)
A single-byte RET instruction.
Parameters return_value Value to return
[Link](cookie = 0x7afceb58)
Returns an an egghunter, which searches from esp and upwards for a cookie. However to save bytes,
it only looks at a single 4-byte alignment. Use the function stackhunter_helper to generate a suitable

52

Chapter 2. Module Index

pwntools Documentation, Release 2.2

cookie prefix for you.


The default cookie has been chosen, because it makes it possible to shave a single byte, but other
cookies can be used too.
Example
>>> with [Link]():
...
[Link] = i386
...
print enhex(asm([Link]()))
3d58ebfc7a75faffe4
>>> with [Link]():
...
[Link] = i386
...
print enhex(asm([Link](0xdeadbeef)))
583defbeadde75f8ffe4

[Link]()
A trap instruction.
[Link]

Shellcraft module containing Intel i386 shellcodes for Linux.


[Link].acceptloop_ipv4(port)
Args: port Waits for a connection. Leaves socket in EBP. ipv4 only
[Link](sock=ebp)
Args: [sock (imm/reg) = ebp] Duplicates sock to stdin, stdout and stderr
[Link](sock=ebp)
Args: [sock (imm/reg) = ebp] Duplicates sock to stdin, stdout and stderr and spawns a shell.
[Link](string, sock=ebp)
Writes a string to a file descriptor
[Link](port=None)
Args: port (defaults to any port) Finds a socket, which is connected to the specified port. Leaves socket in ESI.
[Link](port=None)
Args: port (defaults to any) Finds an open socket which connects to a specified port, and then opens a dup2 shell
on it.
[Link](size, port=None)
Findpeer + stager
[Link](in_fd=ebp, size=255, allocate_stack=True)
Reads to the stack from a directory.
Parameters
in_fd (int/str) File descriptor to be read from.
size (int) Buffer size.
allocate_stack (bool) allocate size bytes on the stack.
You can optioanlly shave a few bytes not allocating the stack space.
The size read is left in eax.

2.14. [Link] Shellcode generation

53

pwntools Documentation, Release 2.2

[Link].i386_to_amd64()
Returns code to switch from i386 to amd64 mode.
[Link].mprotect_all(clear_ebx=True, fix_null=False)
Calls mprotect(page, 4096, PROT_READ | PROT_WRITE | PROT_EXEC) for every page.
It takes around 0.3 seconds on my box, but your milage may vary.
Parameters
clear_ebx (bool) If this is set to False, then the shellcode will assume that ebx has already
been zeroed.
fix_null (bool) If this is set to True, then the NULL-page will also be mprotected at the
cost of slightly larger shellcode
[Link](gid=egid)
Args: [gid (imm/reg) = egid] Sets the real and effective group id.
[Link](uid=euid)
Args: [uid (imm/reg) = euid] Sets the real and effective user id.
[Link]()
Execute /bin/sh
[Link](sock, size)
Recives a fixed sized payload into a mmaped buffer Useful in conjuncion with findpeer.
[Link](syscall=None, arg0=None, arg1=None, arg2=None,
arg3=None, arg4=None)
Args: [syscall_number, *args] Does a syscall
Example
>>> print [Link](SYS_execve, 1, esp, 2, 0).rstrip()
/* call execve(1, esp, 2, 0) */
push 0x1
pop ebx
mov ecx, esp
push 0x2
pop edx
xor esi, esi
push 0xb
pop eax
int 0x80
>>> print [Link](SYS_execve, 2, 1, 0, 20).rstrip()
/* call execve(2, 1, 0, 20) */
push 0x2
pop ebx
push 0x1
pop ecx
push 0x14
pop esi
push 0xb
pop eax
cdq /* Set edx to 0, eax is known to be positive */
int 0x80
>>> print [Link]().rstrip()
/* call syscall() */

54

Chapter 2. Module Index

pwntools Documentation, Release 2.2

int 0x80
>>> print [Link](eax, ebx, ecx).rstrip()
/* call syscall(eax, ebx, ecx) */
/* moving ebx into ebx, but this is a no-op */
/* moving ecx into ecx, but this is a no-op */
/* moving eax into eax, but this is a no-op */
int 0x80
>>> print [Link](ebp, None, None, 1).rstrip()
/* call syscall(ebp, ?, ?, 1) */
push 0x1
pop edx
mov eax, ebp
int 0x80

[Link]

Shellcraft module containing Intel i386 shellcodes for FreeBSD.


[Link].acceptloop_ipv4(port)
Args: port Waits for a connection. Leaves socket in EBP. ipv4 only
[Link].i386_to_amd64()
Returns code to switch from i386 to amd64 mode.
[Link]()
Execute /bin/sh
[Link] Shellcode for Thumb Mode
[Link]

Shellcraft module containing generic thumb little endian shellcodes.


[Link]()
An infinite loop.
[Link](dst, src)
Returns THUMB code for moving the specified source value into the specified destination register.
[Link]()
A nop instruction.
[Link](string, append_null=True)
Pushes a string onto the stack without using null bytes or newline characters.
Parameters
string (str) The string to push.
append_null (bool) Whether to append a single NULL-byte before pushing.
Examples

>>>> with [Link](): ... [Link] = thumb ... print enhex(asm([Link](HellonWorld!,


True)))
81ea010102b4dff8041001e0726c642102b4dff8041001e06f0a576f02b4dff8041001e048656c6c02b4
>>>> with [Link](): ...
[Link] = thumb ...
print enhex(asm([Link](,

2.14. [Link] Shellcode generation

55

pwntools Documentation, Release 2.2

True))) 81ea010102b4 >>>> with [Link](): ...


hex(asm([Link](x00, False))) 81ea010102b4

[Link] = thumb ...

print en-

[Link](return_value=None)
A single-byte RET instruction.
Parameters return_value Value to return
[Link]

Shellcraft module containing THUMB shellcodes for Linux.


[Link](port, network)
Listens on a TCP port and spawns a shell for the first to connect. Port is the TCP port to listen on, network is
either ipv4 or ipv6.
[Link](sock=r6)
Args: [sock (imm/reg) = r6] Duplicates sock to stdin, stdout and stderr
[Link](sock=r6)
Args: [sock (imm/reg) = ebp] Duplicates sock to stdin, stdout and stderr and spawns a shell.
[Link](port)
Finds a connected socket. If port is specified it is checked against the peer port. Resulting socket is left in r6.
[Link](port)
Finds a connected socket. If port is specified it is checked against the peer port. A dup2 shell is spawned on it.
[Link](port, network)
Listens on a TCP port, accept a client and leave his socket in r6. Port is the TCP port to listen on, network is
either ipv4 or ipv6.
[Link]()
Execute /bin/sh

2.15 [Link] Terminal handling


[Link].can_init()
This function returns True iff stdout is a tty and we are not inside a REPL.
[Link]()
Calling this function will take over the terminal (if can_init() returns True) until the current python interpreter is closed.
It is on our TODO, to create a function to give back the terminal without closing the interpreter.
[Link].term_mode = False
This is True exactly when we have taken over the terminal using init().

2.16 [Link] Timeout handling


Timeout encapsulation, complete with countdowns and scope managers.
class [Link](timeout=[Link])
Implements a basic class which has a timeout, and support for scoped timeout countdowns.
Valid timeout values are:
56

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link] use the global default value ([Link])


[Link] or None never time out
Any positive float, indicates timeouts in seconds
Example
>>> [Link] = 30
>>> t = Timeout()
>>> [Link] == 30
True
>>> t = Timeout(5)
>>> [Link] == 5
True
>>> i = 0
>>> with [Link]():
...
print (4 <= [Link] and [Link] <= 5)
...
True
>>> with [Link](0.5):
...
while [Link]:
...
print round([Link],1)
...
[Link](0.1)
0.5
0.4
0.3
0.2
0.1
>>> print [Link]
5.0
>>> with [Link](0.5):
...
for i in range(5):
...
print round([Link],1)
...
[Link](0.1)
0.5
0.5
0.5
0.5
0.5
>>> print [Link]
5.0

countdown(timeout=[Link])
Scoped timeout setter. Sets the timeout within the scope, and restores it when leaving the scope.
When accessing timeout within the scope, it will be calculated against the time when the scope was
entered, in a countdown fashion.
If None is specified for timeout, then the current timeout is used is made. This allows None to be
specified as a default argument with less complexity.
default = [Link]
Value indicating that the timeout should not be changed
forever = None
Value indicating that a timeout should not ever occur
local(timeout)
Scoped timeout setter. Sets the timeout within the scope, and restores it when leaving the scope.
2.16. [Link] Timeout handling

57

pwntools Documentation, Release 2.2

maximum = 1048576.0
Maximum value for a timeout. Used to get around platform issues with very large timeouts.
OSX does not permit setting socket timeouts to 2**22. Assume that if we receive a timeout of 2**21 or
greater, that the value is effectively infinite.
timeout
Timeout for obj operations. By default, uses [Link].
timeout_change()
Callback for subclasses to hook a timeout change.

2.17 [Link] Talking to the World!


The pwnlib is not a big truck! Its a series of tubes!
This is our library for talking to sockets, processes, ssh connections etc. Our goal is to be able to use the same API for
e.g. remote TCP servers, local TTY-programs and programs run over over SSH.
It is organized such that the majority of the functionality is implemented in [Link]. The remaining
classes should only implement just enough for the class to work and possibly code pertaining only to that specific kind
of tube.

2.17.1 Sockets
class [Link](host,
port,
fam=any,
typ=tcp,
timeout=[Link], ssl=False, sock=None)
Bases: [Link]
Creates a TCP or UDP-connection to a remote host. It supports both IPv4 and IPv6.
The returned object supports all the methods from [Link] and [Link].
Parameters
host (str) The host to connect to.
port (int) The port to connect to.
fam The string any,
[Link]().

ipv4

or

ipv6

or

an

integer

to

pass

to

typ The string tcp or udp or an integer to pass to [Link]().


timeout A positive number, None or the string default.
ssl (bool) Wrap the socket with SSL
sock (socket) Socket to inherit, rather than connecting
Examples
>>> r = remote([Link], 443, ssl=True)
>>> [Link](GET /\r\n\r\n)
>>> [Link](4)
HTTP
>>> r = remote([Link], 1)
Traceback (most recent call last):

58

Chapter 2. Module Index

pwntools Documentation, Release 2.2

...
PwnlibException: Could not connect to [Link] on port 1
>>> import socket
>>> s = [Link]()
>>> [Link](([Link], 80))
>>> [Link](GET / + \r\n*2)
9
>>> r = [Link](s)
>>> [Link](4)
HTTP
Traceback (most recent call last):
...
PwnlibException: Could not connect to [Link] on port 1

classmethod fromsocket(socket)
Helper method to wrap a standard python [Link] with the tube APIs.
Parameters socket Instance of [Link]
Returns Instance of [Link].
class [Link](port=0, bindaddr=[Link], fam=any,
out=[Link])
Bases: [Link]

typ=tcp,

time-

Creates an TCP or UDP-socket to receive data on. It supports both IPv4 and IPv6.
The returned object supports all the methods from [Link] and [Link].
Parameters
port (int) The port to connect to.
bindaddr (str) The address to bind to.
fam The string any,
[Link]().

ipv4

or

ipv6

or

an

integer

to

pass

to

typ The string tcp or udp or an integer to pass to [Link]().


timeout A positive number, None
wait_for_connection()
Blocks until a connection has been established.
class [Link]
Bases: [Link]
Methods available exclusively to sockets.

2.17.2 Processes
class [Link](args, shell=False, executable=None, cwd=None, env=None,
timeout=[Link])
Bases: [Link]
Implements a tube which talks to a process on stdin/stdout/stderr.

2.17. [Link] Talking to the World!

59

pwntools Documentation, Release 2.2

Examples
>>> context.log_level=error
>>> p = process(which(python2))
>>> [Link]("print Hello world")
>>> [Link]("print Wow, such data");
>>> == [Link](timeout=0.01)
True
>>> [Link](send)
>>> [Link]
True
>>> [Link](send)
False
>>> [Link]()
Hello world\n
>>> [Link](,)
Wow,
>>> [Link](.*data)
such data
>>> [Link]()
\n
>>> [Link]()
Traceback (most recent call last):
...
EOFError
Traceback (most recent call last):
...
EOFError

communicate(stdin = None) str


Calls [Link]() method on the process.
kill()
Kills the process.
poll() int
Poll the exit code of the process. Will return None, if the process has not yet finished and the exit code
otherwise.

2.17.3 SSH
class [Link](user,
host,
port=22,
password=None,
key=None,
file=None,
proxy_command=None,
proxy_sock=None,
out=[Link])

keytime-

__call__(attr)
Permits function-style access to run commands over SSH
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print repr(s(echo hello))
hello

60

Chapter 2. Module Index

pwntools Documentation, Release 2.2

__getattr__(attr)
Permits member access to run commands over SSH
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print [Link](hello)
...
print [Link]()
...
print [Link]([huh,yay,args])
hello
demouser
huh yay args

__getitem__(attr)
Permits indexed access to run commands over SSH
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print s[echo hello]
hello

close()
Close the connection.
connect_remote(host, port, timeout = [Link]) ssh_connecter
Connects to a host through an SSH connection. This is equivalent to using the -L flag on ssh.
Returns a [Link].ssh_connecter object.
Examples
>>> from pwn import *
>>> l = listen()
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
a = s.connect_remote(localhost, [Link])
...
b = l.wait_for_connection()
...
[Link](Hello)
...
print repr([Link]())
Hello\n

connected()
Returns True if we are connected.

2.17. [Link] Talking to the World!

61

pwntools Documentation, Release 2.2

Example
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print [Link]()
...
[Link]()
...
print [Link]()
True
False

download_data(remote)
Downloads a file from the remote server and returns it as a string.
Parameters remote (str) The remote filename to download.
Examples
>>> with file(/tmp/bar,w+) as f:
...
[Link](Hello, world)
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print s.download_data(/tmp/bar)
Hello, world

download_dir(local, remote=None)
Recursively uploads a directory onto the remote server
Parameters
local Local directory
remote Remote directory
download_file(remote, local=None)
Downloads a file from the remote server.
The file is cached in /tmp/pwntools-ssh-cache using a hash of the file, so calling the function twice has
little overhead.
Parameters
remote (str) The remote filename to download
local (str) The local filename to save it to. Default is to infer it from the remote filename.
interactive(shell=None)
Create an interactive session.
This is a simple wrapper for creating a new [Link].ssh_channel object and calling
[Link].ssh_channel.interactive() on it.
libs(remote, directory=None)
Downloads the libraries referred to by a file.
This is done by running ldd on the remote server, parsing the output and downloading the relevant files.
The directory argument specified where to download the files. This defaults to ./$HOSTNAME where
$HOSTNAME is the hostname of the remote server.

62

Chapter 2. Module Index

pwntools Documentation, Release 2.2

listen_remote(port = 0, bind_address = , timeout = [Link]) ssh_connecter


Listens remotely through an SSH connection. This is equivalent to using the -R flag on ssh.
Returns a [Link].ssh_listener object.
Examples
>>> from pwn import *
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
l = s.listen_remote()
...
a = remote(localhost, [Link])
...
b = l.wait_for_connection()
...
[Link](Hello)
...
print repr([Link]())
Hello\n

run(process, tty = False, wd = None, env = None, timeout = [Link]) ssh_channel


Open a new channel with a specific process inside. If tty is True, then a TTY is requested on the remote
server.
Return a [Link].ssh_channel object.
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
py = [Link](python -i)
...
_ = [Link](>>> )
...
[Link](print 2+2)
...
[Link](exit)
...
print repr([Link]())
4\n

run_to_end(process, tty = False, timeout = [Link], env = None) str


Run a command on the remote server and return a tuple with (data, exit_status). If tty is True, then the
command is run inside a TTY on the remote server.
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
print s.run_to_end(echo Hello; exit 17)
(Hello\n, 17)

set_working_directory(wd=None)
Sets the working directory in which future commands will be run (via [Link]) and to which files will be
uploaded/downloaded from if no path is provided
Parameters wd (string) Working directory. Default is to auto-generate a directory based on
the result of running mktemp -d on the remote machine.

2.17. [Link] Talking to the World!

63

pwntools Documentation, Release 2.2

Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
cwd = s.set_working_directory()
...
print == [Link]()
...
print [Link]() == cwd
True
True

shell(shell = None, tty = False, timeout = [Link]) ssh_channel


Open a new channel with a shell inside.
Parameters
shell (str) Path to the shell program to run. If None, uses the default shell for the logged
in user.
tty (bool) If True, then a TTY is requested on the remote server.
Returns Return a [Link].ssh_channel object.
Examples
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
sh = [Link](/bin/sh)
...
[Link](echo Hello; exit)
...
print Hello in [Link]()
True

upload_data(data, remote)
Uploads some data into a file on the remote server.
Parameters
data (str) The data to upload.
remote (str) The filename to upload it to.
Examoles:
>>> with ssh(host=localhost,
...
user=demouser,
...
password=demopass) as s:
...
s.upload_data(Hello, world, /tmp/foo)
...
print file(/tmp/foo).read()
Hello, world

upload_dir(local, remote=None)
Recursively uploads a directory onto the remote server
Parameters
local Local directory
remote Remote directory

64

Chapter 2. Module Index

pwntools Documentation, Release 2.2

upload_file(filename, remote=None)
Uploads a file to the remote server. Returns the remote filename.
Args: filename(str): The local filename to download remote(str): The remote filename to save it to. Default
is to infer it from the local filename.
class [Link].ssh_channel
Bases: [Link]
interactive(prompt = [Link].bold_red($) + )
If not in TTY-mode, this does exactly the same as meth:[Link], otherwise it
does mostly the same.
An SSH connection in TTY-mode will typically supply its own prompt, thus the prompt argument is
ignored in this case. We also have a few SSH-specific hacks that will ideally be removed once the
[Link] is more mature.
kill()
Kills the process.
poll() int
Poll the exit code of the process. Will return None, if the process has not yet finished and the exit code
otherwise.
class [Link].ssh_connecter
Bases: [Link]
class [Link].ssh_listener
Bases: [Link]

2.17.4 Common functionality


class [Link]
Container of all the tube functions common to sockets, TTYs and SSH connetions.
__enter__()
Permit use of with to control scoping and closing sessions.
Examples
>>> t = tube()
>>> def p(x): print x
>>> [Link] = lambda: p("Closed!")
>>> with t: pass
Closed!

__exit__(type, value, traceback)


Handles closing for with statement
See __enter__()
__lshift__(other)
Shorthand for connecting multiple tubes.
See connect_input() for more information.

2.17. [Link] Talking to the World!

65

pwntools Documentation, Release 2.2

Examples

The following are equivalent


tube_a >> tube.b
tube_a.connect_input(tube_b)

This is useful when chaining multiple tubes


tube_a >> tube_b >> tube_a
tube_a.connect_input(tube_b)
tube_b.connect_input(tube_a)

__ne__(other)
Shorthand for connecting tubes to eachother.
The following are equivalent
a >> b >> a
a <> b

See connect_input() for more information.


__rshift__(other)
Inverse of the << operator. See __lshift__().
See connect_input() for more information.
can_recv(timeout = 0) bool
Returns True, if there is data available within timeout seconds.
Examples
>>> import time
>>> t = tube()
>>> t.can_recv_raw = lambda *a: False
>>> t.can_recv()
False
>>> _=[Link](data)
>>> t.can_recv()
True
>>> _=[Link]()
>>> t.can_recv()
False

clean(timeout = 0.05)
Removes all the buffered data from a tube by calling [Link]() with a
low timeout until it fails.
If timeout is zero, only cached data will be cleared.
Note: If timeout is set to zero, the underlying network is not actually polled; only the internal buffer is
cleared.
Returns All data received

66

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Examples
>>> t = tube()
>>> [Link](clean me up)
>>> [Link](0)
clean me up
>>> len([Link])
0

clean_and_log(timeout = 0.05)
Works exactly as [Link](),
[Link]().

but logs recieved data with

Returns All data received


Examples
def recv(n, data=[, hooray_data]):
while data: return [Link]()
t = tube()
t.recv_raw
= recv
t.connected_raw = lambda d: True
[Link]
= lambda: 1234
with [Link](log_level=info):
data = t.clean_and_log()
hooray_data
>>> data
hooray_data
>>> [Link]()

>>>
...
>>>
>>>
>>>
>>>
>>>
...

close()
Closes the tube.
connect_both(other)
Connects the both ends of this tube object with another tube object.
connect_input(other)
Connects the input of this tube to the output of another tube object.
Examples
>>> def p(x): print x
>>> def recvone(n, data=[data]):
...
while data: return [Link]()
...
raise EOFError
>>> a = tube()
>>> b = tube()
>>> a.recv_raw = recvone
>>> b.send_raw = p
>>> a.connected_raw = lambda d: True
>>> b.connected_raw = lambda d: True
>>> [Link]
= lambda d: True
>>> [Link]
= lambda d: True
>>> import time
>>> _=(b.connect_input(a), [Link](0.1))
data

2.17. [Link] Talking to the World!

67

pwntools Documentation, Release 2.2

connect_output(other)
Connects the output of this tube to the input of another tube object.
Examples
>>> def p(x): print x
>>> def recvone(n, data=[data]):
...
while data: return [Link]()
...
raise EOFError
>>> a = tube()
>>> b = tube()
>>> a.recv_raw = recvone
>>> b.send_raw = p
>>> a.connected_raw = lambda d: True
>>> b.connected_raw = lambda d: True
>>> [Link]
= lambda d: True
>>> [Link]
= lambda d: True
>>> _=(a.connect_output(b), [Link](0.1))
data

connected(direction = any) bool


Returns True if the tube is connected in the specified direction.
Parameters direction (str) Can be the string any, in, read, recv, out, write, send.
Doctest:
>>> def p(x): print x
>>> t = tube()
>>> t.connected_raw = p
>>> _=map([Link], (any, in, read, recv, out, write, send))
any
recv
recv
recv
send
send
send
>>> [Link](bad_value)
Traceback (most recent call last):
...
KeyError: "direction must be in [any, in, out, read, recv, send, write]"
Traceback (most recent call last):
...
KeyError: "direction must be in [any, in, out, read, recv, send, write]"

connected_raw(direction)
connected(direction = any) -> bool
Should not be called directly. Returns True iff the tube is connected in the given direction.
fileno() int
Returns the file number used for reading.
interactive(prompt = [Link].bold_red($) + )
Does simultaneous reading and writing to the tube. In principle this just connects the tube to standard in
and standard out, but in practice this is much more usable, since we are using [Link] to print a
floating prompt.

68

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Thus it only works in while in [Link].term_mode.


newline = \n
Delimiter to use for sendline(), recvline(), and related functions.
recv(numb = 4096, timeout = default) str
Receives up to numb bytes of data from the tube, and returns as soon as any quantity of data is available.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Raises [Link]: The connection is closed
Returns A string containing bytes received from the socket, or if a timeout occurred while
waiting.
Examples
>>> t = tube()
>>> # Fake a data source
>>> t.recv_raw = lambda n: Hello, world
>>> [Link]() == Hello, world
True
>>> [Link](Woohoo)
>>> [Link]() == Woohoo
True
>>> with [Link](log_level=debug):
...
_ = [Link]()
[...] Received 0xc bytes:
Hello, world

recvall() str
Receives data until EOF is reached.
recvline(keepends = True) str
Receive a single line from the tube.
A line is any sequence of bytes terminated by the byte sequence set in newline, which defaults to
\n.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Parameters
keepends (bool) Keep the line ending (True).
timeout (int) Timeout
Returns All bytes received over the tube until the first newline \n is received. Optionally
retains the ending.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: Foo\nBar\r\nBaz\n
>>> [Link]()
Foo\n
>>> [Link]()

2.17. [Link] Talking to the World!

69

pwntools Documentation, Release 2.2

Bar\r\n
>>> [Link](keepends = False)
Baz
>>> [Link] = \r\n
>>> [Link](keepends = False)
Foo\nBar

recvline_contains(items, keepends=False, timeout=[Link])


Receive lines until one line is found which contains at least one of items.
Parameters
items (str,tuple) List of strings to search for, or a single string.
keepends (bool) Return lines with newlines if True
timeout (int) Timeout, in seconds
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: "Hello\nWorld\nXylophone\n"
>>> t.recvline_contains(r)
World
>>> f = lambda n: "cat dog bird\napple pear orange\nbicycle car train\n"
>>> t = tube()
>>> t.recv_raw = f
>>> t.recvline_contains(pear)
apple pear orange
>>> t = tube()
>>> t.recv_raw = f
>>> t.recvline_contains((car, train))
bicycle car train

recvline_endswith(delims, keepends = False, timeout = default) str


Keep recieving lines until one is found that starts with one of delims. Returns the last line recieved.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
See recvline_startswith() for more details.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: Foo\nBar\nBaz\nKaboodle\n
>>> t.recvline_endswith(r)
Bar
>>> t.recvline_endswith(tuple(abcde), True)
Kaboodle\n
>>> t.recvline_endswith(oodle)
Kaboodle

recvline_pred(pred, keepends = False) str


Receive data until pred(line) returns a truthy value. Drop all other data.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
70

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Parameters pred (callable) Function to call. Returns the line for which this function returns
True.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n:
>>> t.recvline_pred(lambda
Bar
>>> t.recvline_pred(lambda
Bar\n
>>> t.recvline_pred(lambda

"Foo\nBar\nBaz\n"
line: line == "Bar\n")
line: line == "Bar\n", keepends=True)
line: line == Nope!, timeout=0.1)

recvline_regex(regex, exact=False, keepends=False, timeout=[Link])


recvregex(regex, exact = False, keepends = False, timeout = default) -> str
Wrapper around recvline_pred(), which will return when a regex matches a line.
By default [Link]() is used,
[Link]() will be used instead.

but if exact is set to True,

then

If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
recvline_startswith(delims, keepends = False, timeout = default) str
Keep recieving lines until one is found that starts with one of delims. Returns the last line recieved.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Parameters
delims (str,tuple) List of strings to search for, or string of single characters
keepends (bool) Return lines with newlines if True
timeout (int) Timeout, in seconds
Returns The first line received which starts with a delimiter in delims.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: "Hello\nWorld\nXylophone\n"
>>> t.recvline_startswith(tuple(WXYZ))
World
>>> t.recvline_startswith(tuple(WXYZ), True)
Xylophone\n
>>> t.recvline_startswith(Wo)
World

recvlines(numlines, keepends = False, timeout = default) str list


Recieve up to numlines lines.
A line is any sequence of bytes terminated by the byte sequence set by newline, which defaults to
\n.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
2.17. [Link] Talking to the World!

71

pwntools Documentation, Release 2.2

Parameters
numlines (int) Maximum number of lines to receive
keepends (bool) Keep newlines at the end of each line (False).
timeout (int) Maximum timeout
Raises [Link]: The connection closed before the request could be satisfied
Returns A string containing bytes received from the socket, or if a timeout occurred while
waiting.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: \n
>>> [Link](3)
[, , ]
>>> t.recv_raw = lambda n: Foo\nBar\nBaz\n
>>> [Link](3)
[Foo, Bar, Baz]
>>> [Link](3, True)
[Foo\n, Bar\n, Baz\n]

recvn(numb, timeout = default) str


Recieves exactly n bytes.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Raises [Link]: The connection closed before the request could be satisfied
Returns A string containing bytes received from the socket, or if a timeout occurred while
waiting.
Examples
>>> t = tube()
>>> data = hello world
>>> t.recv_raw = lambda *a: data
>>> [Link](len(data)) == data
True
>>> [Link](len(data)+1) == data + data[0]
True
>>> t.recv_raw = lambda *a: None
>>> # The remaining data is buffered
>>> [Link]() == data[1:]
True
>>> t.recv_raw = lambda *a: [Link](0.01) or a
>>> [Link](10, timeout=0.05)

>>> [Link](10, timeout=0.05)


aaaaaaaaaa

recvpred(pred, timeout = default) str


Receives one byte at a time from the tube, until pred(bytes) evaluates to True.

72

Chapter 2. Module Index

pwntools Documentation, Release 2.2

If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Parameters
pred (callable) Function to call, with the currently-accumulated data.
timeout (int) Timeout for the operation
Raises [Link]: The connection is closed
Returns A string containing bytes received from the socket, or if a timeout occurred while
waiting.
recvregex(regex, exact = False, timeout = default) str
Wrapper around recvpred(), which will return when a regex matches the string in the buffer.
By default [Link]() is used,
[Link]() will be used instead.

but if exact is set to True,

then

If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
recvrepeat()
Receives data until a timeout or EOF is reached.
Examples
>>> data = [
... d,
... , # simulate timeout
... c,
... b,
... a,
... ]
>>> def delayrecv(n, data=data):
...
return [Link]()
>>> t = tube()
>>> t.recv_raw = delayrecv
>>> [Link](0.2)
abc
>>> [Link]()
d

recvuntil(delims, timeout = default) str


Recieve data until one of delims is encountered.
If the request is not satisfied before timeout seconds pass, all data is buffered and an empty string ()
is returned.
Parameters
delims (str,tuple) String of delimiters characters, or list of delimiter strings.
drop (bool) Drop the ending. If True it is removed from the end of the return value.
Raises [Link]: The connection closed before the request could be satisfied
Returns A string containing bytes received from the socket, or if a timeout occurred while
waiting.

2.17. [Link] Talking to the World!

73

pwntools Documentation, Release 2.2

Examples
>>> t = tube()
>>> t.recv_raw = lambda n: "Hello World!"
>>> [Link]( )
Hello
>>> _=[Link](0)
>>> # Matches on o in Hello
>>> [Link](tuple( Wor))
Hello
>>> _=[Link](0)
>>> # Matches expressly full string
>>> [Link]( Wor)
Hello Wor
>>> _=[Link](0)
>>> # Matches on full string, drops match
>>> [Link]( Wor, drop=True)
Hello
>>> # Try with regex special characters
>>> t = tube()
>>> t.recv_raw = lambda n: "Hello|World"
>>> [Link](|, drop=True)
Hello

send(data)
Sends data.
If log level DEBUG is enabled, also prints out the data received.
If it is not possible to send anymore because of a closed connection, it raises [Link]
Examples
>>> def p(x): print repr(x)
>>> t = tube()
>>> t.send_raw = p
>>> [Link](hello)
hello

sendafter(delim, data, timeout = default) str


A combination of recvuntil(delim, timeout) and send(data).
sendline(data)
Shorthand for [Link](data + [Link]).
Examples
>>> def p(x): print repr(x)
>>> t = tube()
>>> t.send_raw = p
>>> [Link](hello)
hello\n
>>> [Link] = \r\n
>>> [Link](hello)
hello\r\n

74

Chapter 2. Module Index

pwntools Documentation, Release 2.2

sendlineafter(delim, data, timeout = default) str


A combination of recvuntil(delim, timeout) and sendline(data).
sendlinethen(delim, data, timeout = default) str
A combination of sendline(data) and recvuntil(delim, timeout).
sendthen(delim, data, timeout = default) str
A combination of send(data) and recvuntil(delim, timeout).
settimeout(timeout)
Set the timeout for receiving operations. If the string default is given, then [Link] will
be used. If None is given, then there will be no timeout.
Examples
>>> t = tube()
>>> t.settimeout_raw = lambda t: None
>>> [Link](3)
>>> [Link] == 3
True

shutdown(direction = send)
Closes the tube for futher reading or writing depending on direction.
Parameters direction (str) Which direction to close; in, read or recv closes the tube in
the ingoing direction, out, write or send closes it in the outgoing direction.
Returns None
Examples
>>> def p(x): print x
>>> t = tube()
>>> t.shutdown_raw = p
>>> _=map([Link], (in, read, recv, out, write, send))
recv
recv
recv
send
send
send
>>> [Link](bad_value)
Traceback (most recent call last):
...
KeyError: "direction must be in [in, out, read, recv, send, write]"
Traceback (most recent call last):
...
KeyError: "direction must be in [in, out, read, recv, send, write]"

shutdown_raw(direction)
Should not be called directly. Closes the tube for further reading or writing.
spawn_process(*args, **kwargs)
Spawns a new process having this tube as stdin, stdout and stderr.
Takes the same arguments as [Link].

2.17. [Link] Talking to the World!

75

pwntools Documentation, Release 2.2

timeout_change()
Informs the raw layer of the tube that the timeout has changed.
Should not be called directly.
Inherited from Timeout.
unrecv(data)
Puts the specified data back at the beginning of the receive buffer.
Examples
>>> t = tube()
>>> t.recv_raw = lambda n: hello
>>> [Link]()
hello
>>> [Link]()
hello
>>> [Link](world)
>>> [Link]()
world
>>> [Link]()
hello

wait_for_close()
Waits until the tube is closed.

2.18 [Link] Functions for user interaction


[Link](text)
Shows text like the command line tool more.
It not in term_mode, just prints the data to the screen.
Parameters text (str) The text to show.
Returns None
[Link](prompt, opts, default=None)
Presents the user with a prompt (typically in the form of a question) and a number of options.
Parameters
prompt (str) The prompt to show
opts (list) The options to show to the user
default The default option to choose
Returns The users choice in the form of an integer.
[Link](n=None)
Waits for either user input or a specific number of seconds.

2.19 [Link] A database of useragent strings


Database of >22,000 user agent strings

76

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link]() str set


Get all the user agents that we know about.
Returns A set of user agent strings.
Examples
>>> libcurl-agent/1.0 in getall()
True
>>> wget in getall()
True

[Link]() str
Get a random user agent string.
Returns A random user agent string selected from getall().

>>> import random as randommod


>>> [Link](1)
>>> random()
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; FunWebProducts; FunWebProducts-MyTotalSearch

2.20 [Link] Calculating CRC-sums


Module for calculating CRC-sums.
Contains all crc implementations know on the interwebz. For most implementations it contains only the core crc
algorithm and not e.g. padding schemes.
It is horribly slow, as implements a naive algorithm working direclty on bit polynomials.
The current algorithm is super-linear and takes about 4 seconds to calculate the crc32-sum of A*40000.
An obvious optimization would be to actually generate some lookup-tables.
[Link].generic_crc(data, polynom, width, init, refin, refout, xorout)
A generic CRC-sum function.
This is suitable to use with: [Link]
The check value in the document is the CRC-sum of the string 123456789.
Parameters
data (str) The data to calculate the CRC-sum of. This should either be a string or a list of
bits.
polynom (int) The polynomial to use.
init (int) If the CRC-sum was calculated in hardware, then this would b the initial value
of the checksum register.
refin (bool) Should the input bytes be reflected?
refout (bool) Should the checksum be reflected?
xorout (int) The value to xor the checksum with before outputting
[Link](data) int
Calculates the same checksum as returned by the UNIX-tool cksum.

2.20. [Link] Calculating CRC-sums

77

pwntools Documentation, Release 2.2

Parameters data (str) The data to checksum.


Example
>>> print cksum(123456789)
930766865

[Link].find_crc_function(data, checksum)
Finds all known CRC functions that hashes a piece of data into a specific checksum. It does this by trying all
known CRC functions one after the other.
Parameters data (str) Data for which the checksum is known.
Example
>>> find_crc_function(test, 46197)
[<function crc_crc_16_dnp at ...>]

[Link](data) int
Calculates the arc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
width = 16
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print arc(123456789)
47933

[Link].crc_10(data) int
Calculates the crc_10 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x233
width = 10
init = 0x0
refin = False
refout = False
xorout = 0x0

78

Chapter 2. Module Index

pwntools Documentation, Release 2.2

See also: [Link]


Parameters data (str) The data to checksum.
Example
>>> print crc_10(123456789)
409

[Link].crc_10_cdma2000(data) int
Calculates the crc_10_cdma2000 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3d9
width = 10
init = 0x3ff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_10_cdma2000(123456789)
563

[Link].crc_11(data) int
Calculates the crc_11 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x385
width = 11
init = 0x1a
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_11(123456789)
1443

2.20. [Link] Calculating CRC-sums

79

pwntools Documentation, Release 2.2

[Link].crc_12_3gpp(data) int
Calculates the crc_12_3gpp checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x80f
width = 12
init = 0x0
refin = False
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_12_3gpp(123456789)
3503

[Link].crc_12_cdma2000(data) int
Calculates the crc_12_cdma2000 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xf13
width = 12
init = 0xfff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_12_cdma2000(123456789)
3405

[Link].crc_12_dect(data) int
Calculates the crc_12_dect checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x80f
width = 12
init = 0x0
refin = False

80

Chapter 2. Module Index

pwntools Documentation, Release 2.2

refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_12_dect(123456789)
3931

[Link].crc_13_bbc(data) int
Calculates the crc_13_bbc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1cf5
width = 13
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_13_bbc(123456789)
1274

[Link].crc_14_darc(data) int
Calculates the crc_14_darc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x805
width = 14
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.

2.20. [Link] Calculating CRC-sums

81

pwntools Documentation, Release 2.2

Example
>>> print crc_14_darc(123456789)
2093

[Link].crc_15(data) int
Calculates the crc_15 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4599
width = 15
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_15(123456789)
1438

[Link].crc_15_mpt1327(data) int
Calculates the crc_15_mpt1327 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x6815
width = 15
init = 0x0
refin = False
refout = False
xorout = 0x1
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_15_mpt1327(123456789)
9574

[Link].crc_16_aug_ccitt(data) int
Calculates the crc_16_aug_ccitt checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
82

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 16
init = 0x1d0f
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_aug_ccitt(123456789)
58828

[Link].crc_16_buypass(data) int
Calculates the crc_16_buypass checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
width = 16
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_buypass(123456789)
65256

[Link].crc_16_ccitt_false(data) int
Calculates the crc_16_ccitt_false checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xffff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

83

pwntools Documentation, Release 2.2

Example
>>> print crc_16_ccitt_false(123456789)
10673

[Link].crc_16_cdma2000(data) int
Calculates the crc_16_cdma2000 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xc867
width = 16
init = 0xffff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_cdma2000(123456789)
19462

[Link].crc_16_dds_110(data) int
Calculates the crc_16_dds_110 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
width = 16
init = 0x800d
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_dds_110(123456789)
40655

[Link].crc_16_dect_r(data) int
Calculates the crc_16_dect_r checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x589
84

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 16
init = 0x0
refin = False
refout = False
xorout = 0x1
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_dect_r(123456789)
126

[Link].crc_16_dect_x(data) int
Calculates the crc_16_dect_x checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x589
width = 16
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_dect_x(123456789)
127

[Link].crc_16_dnp(data) int
Calculates the crc_16_dnp checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3d65
width = 16
init = 0x0
refin = True
refout = True
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

85

pwntools Documentation, Release 2.2

Example
>>> print crc_16_dnp(123456789)
60034

[Link].crc_16_en_13757(data) int
Calculates the crc_16_en_13757 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3d65
width = 16
init = 0x0
refin = False
refout = False
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_en_13757(123456789)
49847

[Link].crc_16_genibus(data) int
Calculates the crc_16_genibus checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xffff
refin = False
refout = False
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_genibus(123456789)
54862

[Link].crc_16_maxim(data) int
Calculates the crc_16_maxim checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
86

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 16
init = 0x0
refin = True
refout = True
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_maxim(123456789)
17602

[Link].crc_16_mcrf4xx(data) int
Calculates the crc_16_mcrf4xx checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xffff
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_mcrf4xx(123456789)
28561

[Link].crc_16_riello(data) int
Calculates the crc_16_riello checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xb2aa
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

87

pwntools Documentation, Release 2.2

Example
>>> print crc_16_riello(123456789)
25552

[Link].crc_16_t10_dif(data) int
Calculates the crc_16_t10_dif checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8bb7
width = 16
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_t10_dif(123456789)
53467

[Link].crc_16_teledisk(data) int
Calculates the crc_16_teledisk checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xa097
width = 16
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_teledisk(123456789)
4019

[Link].crc_16_tms37157(data) int
Calculates the crc_16_tms37157 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
88

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 16
init = 0x89ec
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_tms37157(123456789)
9905

[Link].crc_16_usb(data) int
Calculates the crc_16_usb checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
width = 16
init = 0xffff
refin = True
refout = True
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_16_usb(123456789)
46280

[Link].crc_24(data) int
Calculates the crc_24 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x864cfb
width = 24
init = 0xb704ce
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

89

pwntools Documentation, Release 2.2

Example
>>> print crc_24(123456789)
2215682

[Link].crc_24_flexray_a(data) int
Calculates the crc_24_flexray_a checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x5d6dcb
width = 24
init = 0xfedcba
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_24_flexray_a(123456789)
7961021

[Link].crc_24_flexray_b(data) int
Calculates the crc_24_flexray_b checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x5d6dcb
width = 24
init = 0xabcdef
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_24_flexray_b(123456789)
2040760

[Link].crc_31_philips(data) int
Calculates the crc_31_philips checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
90

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 31
init = 0x7fffffff
refin = False
refout = False
xorout = 0x7fffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_31_philips(123456789)
216654956

[Link].crc_32(data) int
Calculates the crc_32 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
width = 32
init = 0xffffffff
refin = True
refout = True
xorout = 0xffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_32(123456789)
3421780262

[Link].crc_32_bzip2(data) int
Calculates the crc_32_bzip2 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
width = 32
init = 0xffffffff
refin = False
refout = False
xorout = 0xffffffff
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

91

pwntools Documentation, Release 2.2

Example
>>> print crc_32_bzip2(123456789)
4236843288

[Link].crc_32_mpeg_2(data) int
Calculates the crc_32_mpeg_2 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
width = 32
init = 0xffffffff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_32_mpeg_2(123456789)
58124007

[Link].crc_32_posix(data) int
Calculates the crc_32_posix checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
width = 32
init = 0x0
refin = False
refout = False
xorout = 0xffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_32_posix(123456789)
1985902208

[Link].crc_32c(data) int
Calculates the crc_32c checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1edc6f41
92

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 32
init = 0xffffffff
refin = True
refout = True
xorout = 0xffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_32c(123456789)
3808858755

[Link].crc_32d(data) int
Calculates the crc_32d checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xa833982b
width = 32
init = 0xffffffff
refin = True
refout = True
xorout = 0xffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_32d(123456789)
2268157302

[Link].crc_32q(data) int
Calculates the crc_32q checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x814141ab
width = 32
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

93

pwntools Documentation, Release 2.2

Example
>>> print crc_32q(123456789)
806403967

[Link].crc_3_rohc(data) int
Calculates the crc_3_rohc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3
width = 3
init = 0x7
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_3_rohc(123456789)
6

[Link].crc_40_gsm(data) int
Calculates the crc_40_gsm checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4820009
width = 40
init = 0x0
refin = False
refout = False
xorout = 0xffffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_40_gsm(123456789)
910907393606

[Link].crc_4_itu(data) int
Calculates the crc_4_itu checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3
94

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 4
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_4_itu(123456789)
7

[Link].crc_5_epc(data) int
Calculates the crc_5_epc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x9
width = 5
init = 0x9
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_5_epc(123456789)
0

[Link].crc_5_itu(data) int
Calculates the crc_5_itu checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x15
width = 5
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

95

pwntools Documentation, Release 2.2

Example
>>> print crc_5_itu(123456789)
7

[Link].crc_5_usb(data) int
Calculates the crc_5_usb checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x5
width = 5
init = 0x1f
refin = True
refout = True
xorout = 0x1f
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_5_usb(123456789)
25

[Link].crc_64(data) int
Calculates the crc_64 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x42f0e1eba9ea3693
width = 64
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_64(123456789)
7800480153909949255

[Link].crc_64_we(data) int
Calculates the crc_64_we checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x42f0e1eba9ea3693
96

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 64
init = 0xffffffffffffffff
refin = False
refout = False
xorout = 0xffffffffffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_64_we(123456789)
7128171145767219210

[Link].crc_64_xz(data) int
Calculates the crc_64_xz checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x42f0e1eba9ea3693
width = 64
init = 0xffffffffffffffff
refin = True
refout = True
xorout = 0xffffffffffffffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_64_xz(123456789)
11051210869376104954

[Link].crc_6_cdma2000_a(data) int
Calculates the crc_6_cdma2000_a checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x27
width = 6
init = 0x3f
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

97

pwntools Documentation, Release 2.2

Example
>>> print crc_6_cdma2000_a(123456789)
13

[Link].crc_6_cdma2000_b(data) int
Calculates the crc_6_cdma2000_b checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x7
width = 6
init = 0x3f
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_6_cdma2000_b(123456789)
59

[Link].crc_6_darc(data) int
Calculates the crc_6_darc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x19
width = 6
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_6_darc(123456789)
38

[Link].crc_6_itu(data) int
Calculates the crc_6_itu checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x3
98

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 6
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_6_itu(123456789)
6

[Link].crc_7(data) int
Calculates the crc_7 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x9
width = 7
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_7(123456789)
117

[Link].crc_7_rohc(data) int
Calculates the crc_7_rohc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4f
width = 7
init = 0x7f
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

99

pwntools Documentation, Release 2.2

Example
>>> print crc_7_rohc(123456789)
83

[Link].crc_8(data) int
Calculates the crc_8 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x7
width = 8
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8(123456789)
244

[Link].crc_82_darc(data) int
Calculates the crc_82_darc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x308c0111011401440411
width = 82
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_82_darc(123456789)
749237524598872659187218

[Link].crc_8_cdma2000(data) int
Calculates the crc_8_cdma2000 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x9b
100

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 8
init = 0xff
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_cdma2000(123456789)
218

[Link].crc_8_darc(data) int
Calculates the crc_8_darc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x39
width = 8
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_darc(123456789)
21

[Link].crc_8_dvb_s2(data) int
Calculates the crc_8_dvb_s2 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xd5
width = 8
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

101

pwntools Documentation, Release 2.2

Example
>>> print crc_8_dvb_s2(123456789)
188

[Link].crc_8_ebu(data) int
Calculates the crc_8_ebu checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1d
width = 8
init = 0xff
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_ebu(123456789)
151

[Link].crc_8_i_code(data) int
Calculates the crc_8_i_code checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1d
width = 8
init = 0xfd
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_i_code(123456789)
126

[Link].crc_8_itu(data) int
Calculates the crc_8_itu checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x7
102

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 8
init = 0x0
refin = False
refout = False
xorout = 0x55
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_itu(123456789)
161

[Link].crc_8_maxim(data) int
Calculates the crc_8_maxim checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x31
width = 8
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_maxim(123456789)
161

[Link].crc_8_rohc(data) int
Calculates the crc_8_rohc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x7
width = 8
init = 0xff
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

103

pwntools Documentation, Release 2.2

Example
>>> print crc_8_rohc(123456789)
208

[Link].crc_8_wcdma(data) int
Calculates the crc_8_wcdma checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x9b
width = 8
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_8_wcdma(123456789)
37

[Link].crc_a(data) int
Calculates the crc_a checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xc6c6
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print crc_a(123456789)
48901

[Link](data) int
Calculates the jamcrc checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x4c11db7
104

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 32
init = 0xffffffff
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print jamcrc(123456789)
873187033

[Link](data) int
Calculates the kermit checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0x0
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print kermit(123456789)
8585

[Link](data) int
Calculates the modbus checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x8005
width = 16
init = 0xffff
refin = True
refout = True
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
2.20. [Link] Calculating CRC-sums

105

pwntools Documentation, Release 2.2

Example
>>> print modbus(123456789)
19255

[Link].x_25(data) int
Calculates the x_25 checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
width = 16
init = 0xffff
refin = True
refout = True
xorout = 0xffff
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print x_25(123456789)
36974

[Link](data) int
Calculates the xfer checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0xaf
width = 32
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print xfer(123456789)
3171672888

[Link](data) int
Calculates the xmodem checksum.
This is simply the generic_crc() with these frozen arguments:
polynom = 0x1021
106

Chapter 2. Module Index

pwntools Documentation, Release 2.2

width = 16
init = 0x0
refin = False
refout = False
xorout = 0x0
See also: [Link]
Parameters data (str) The data to checksum.
Example
>>> print xmodem(123456789)
12739

2.21 [Link] Generation of unique sequences


[Link](length = None, alphabet = string.ascii_lowercase, n = 4) list/str
A simple wrapper over de_bruijn(). This function returns a at most length elements.
If the given alphabet is a string, a string is returned from this function. Otherwise a list is returned.
Parameters
length The desired length of the list or None if the entire sequence is desired.
alphabet List or string to generate the sequence over.
n (int) The length of subsequences that should be unique.
Example
>>> cyclic(alphabet = "ABC", n = 3)
AAABAACABBABCACBACCBBBCBCCC
>>> cyclic(20)
aaaabaaacaaadaaaeaaa
>>> alphabet, n = range(30), 3
>>> len(alphabet)**n, len(cyclic(alphabet = alphabet, n = n))
(27000, 27000)

[Link].cyclic_find(subseq, alphabet = string.ascii_lowercase, n = None) int


Calculates the position of a substring into a De Bruijn sequence.
Parameters
subseq The subsequence to look for. This can either be a string, a list or an integer. If an
integer is provided it will be packed as a little endian integer.
alphabet List or string to generate the sequence over.
n (int) The length of subsequences that should be unique.

2.21. [Link] Generation of unique sequences

107

pwntools Documentation, Release 2.2

Examples
>>> cyclic_find(cyclic(1000)[514:518])
514

[Link].de_bruijn(alphabet = string.ascii_lowercase, n = 4) generator


Generator for a sequence of unique substrings of length n. This is implemented using a De Bruijn Sequence
over the given alphabet.
The returned generator will yield up to len(alphabet)**n elements.
Parameters
alphabet List or string to generate the sequence over.
n (int) The length of subsequences that should be unique.

2.22 [Link] Utilities bit fiddling


[Link].b64d(s) str
Base64 decodes a string
Example
>>> b64d(dGVzdA==)
test

[Link].b64e(s) str
Base64 encodes a string
Example
>>> b64e("test")
dGVzdA==

[Link](s, endian = big, zero = 0, one = 1) list


Converts the argument a list of bits.
Parameters
s A string or number to be converted into bits.
endian (str) The binary endian, default big.
zero The representing a 0-bit.
one The representing a 1-bit.
Returns A list consisting of the values specified in zero and one.
Examples

108

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> bits(511, zero = "+", one = "-")


[+, +, +, +, +, +, +, -, -, -, -, -, -, -, -, -]
>>> sum(bits("test"))
17

[Link].bits_str(s, endian = big, zero = 0, one = 1) str


A wrapper around bits(), which converts the output into a string.
Examples
>>> bits_str(511)
0000000111111111
>>> bits_str("bits_str", endian = "little")
0100011010010110001011101100111011111010110011100010111001001110

[Link](s) str
Reverses the bits in every byte of a given string.
Example
>>> bitswap("1234")
\x8cL\xcc,

[Link].bitswap_int(n) int
Reverses the bits of a numbers and returns the result as a new number.
Parameters
n (int) The number to swap.
width (int) The width of the integer
Examples
>>> hex(bitswap_int(0x1234,
0x2c
>>> hex(bitswap_int(0x1234,
0x2c48
>>> hex(bitswap_int(0x1234,
0x2c4800
>>> hex(bitswap_int(0x1234,
0x589000

8))
16))
24))
25))

[Link](x) str
Hex-encodes a string.
Example
>>> enhex("test")
74657374

[Link].hexdump_iter(s, width=16, skip=True, hexii=False, begin=0, style=None,


highlight=None)
hexdump_iter(s, width = 16, skip = True, hexii = False, begin = 0, style = {}, highlight = []) -> str generator
2.22. [Link] Utilities bit fiddling

109

pwntools Documentation, Release 2.2

Return a hexdump-dump of a string as a generator of lines.


Parameters
s (str) The string to dump
width (int) The number of characters per line
skip (bool) Set to True, if repeated lines should be replaced by a *
hexii (bool) Set to True, if a hexii-dump should be returned instead of a hexdump.
begin (int) Offset of the first byte to print in the left column
style (dict) Color scheme to use.
highlight (iterable) Byte values to highlight.
Returns A hexdump-dump in the form of a string.
[Link](s, width = 16, skip = True) str
Return a HEXII-dump of a string.
Parameters
s (str) The string to dump
width (int) The number of characters per line
skip (bool) Should repeated lines be replaced by a *
Returns A HEXII-dump in the form of a string.
[Link](c) bool
Return True if a character is printable
[Link](count, alphabet = [Link]) str
Returns a random string of a given length using only the specified alphabet.
Parameters
count (int) The length of the desired string.
alphabet The alphabet of allowed characters. Defaults to all lowercase characters.
Returns A random string.
Example
>>> randoms(10)
evafjilupm

[Link](n, k, word_size=None)
Returns a rotation by k of n.
When n is a number, then means ((n << k) | (n >> (word_size - k))) truncated to word_size
bits.
When n is a list, tuple or string, this is n[k % len(n):]

+ n[:k % len(n)].

Parameters
n The value to rotate.
k (int) The rotation amount. Can be a positive or negative number.

110

Chapter 2. Module Index

pwntools Documentation, Release 2.2

word_size (int) If n is a number, then this is the assumed bitsize of n. Defaults to


[Link].word_size if None .
Example
>>> rol(abcdefg, 2)
cdefgab
>>> rol(abcdefg, -2)
fgabcde
>>> hex(rol(0x86, 3, 8))
0x34
>>> hex(rol(0x86, -3, 8))
0xd0

[Link](n, k, word_size=None)
A simple wrapper around rol(), which negates the values of k.
[Link](s, endian = big) str
Converts an iterable of bits into a string.
Parameters
s Iterable of bits
endian (str) The string little or big, which specifies the bits endianness.
Returns A string of the decoded bits.
Example
>>> unbits([1])
\x80
>>> unbits([1], endian = little)
\x01
>>> unbits(bits(hello), endian = little)
\x16\xa666\xf6

[Link](s) str
Hex-decodes a string.
Example
>>> unhex("74657374")
test

[Link](s, ignore_invalid = False) str


URL-decodes a string.
Example
>>> urldecode("test%20%41")
test A
>>> urldecode("%qq")
Traceback (most recent call last):

2.22. [Link] Utilities bit fiddling

111

pwntools Documentation, Release 2.2

...
ValueError: Invalid input to urldecode
>>> urldecode("%qq", ignore_invalid = True)
%qq
Traceback (most recent call last):
...
ValueError: Invalid input to urldecode

[Link](s) str
URL-encodes a string.
Example
>>> urlencode("test")
%74%65%73%74

[Link](*args, cut = max) str


Flattens its arguments using [Link]() and then xors them together. If the end of a
string is reached, it wraps around in the string.
Parameters
args The arguments to be xored together.
cut How long a string should be returned. Can be either min/max/left/right or a
number.
Returns The string of the arguments xored together.
Example
>>> xor(lol, hello, 42)
. ***

[Link].xor_pair(data, avoid = x00n) -> None or (str, str)


Finds two strings that will xor into a given string, while only using a given alphabet.
Parameters
data (str) The desired string.
avoid The list of disallowed characters. Defaults to nulls and newlines.
Returns Two strings which will xor to the given string. If no such two strings exist, then None is
returned.
Example
>>> xor_pair("test")
(\x01\x01\x01\x01, udru)

2.23 [Link] Hashing functions


Functions for computing various hashes of files and strings.

112

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link].md5file(x)
Calculates the md5 sum of a file
[Link].md5filehex(x)
Calculates the md5 sum of a file; returns hex-encoded
[Link].md5sum(x)
Calculates the md5 sum of a string
[Link].md5sumhex(x)
Calculates the md5 sum of a string; returns hex-encoded
[Link].sha1file(x)
Calculates the sha1 sum of a file
[Link].sha1filehex(x)
Calculates the sha1 sum of a file; returns hex-encoded
[Link].sha1sum(x)
Calculates the sha1 sum of a string
[Link].sha1sumhex(x)
Calculates the sha1 sum of a string; returns hex-encoded
[Link].sha224file(x)
Calculates the sha224 sum of a file
[Link].sha224filehex(x)
Calculates the sha224 sum of a file; returns hex-encoded
[Link].sha224sum(x)
Calculates the sha224 sum of a string
[Link].sha224sumhex(x)
Calculates the sha224 sum of a string; returns hex-encoded
[Link].sha256file(x)
Calculates the sha256 sum of a file
[Link].sha256filehex(x)
Calculates the sha256 sum of a file; returns hex-encoded
[Link].sha256sum(x)
Calculates the sha256 sum of a string
[Link].sha256sumhex(x)
Calculates the sha256 sum of a string; returns hex-encoded
[Link].sha384file(x)
Calculates the sha384 sum of a file
[Link].sha384filehex(x)
Calculates the sha384 sum of a file; returns hex-encoded
[Link].sha384sum(x)
Calculates the sha384 sum of a string
[Link].sha384sumhex(x)
Calculates the sha384 sum of a string; returns hex-encoded
[Link].sha512file(x)
Calculates the sha512 sum of a file

2.23. [Link] Hashing functions

113

pwntools Documentation, Release 2.2

[Link].sha512filehex(x)
Calculates the sha512 sum of a file; returns hex-encoded
[Link].sha512sum(x)
Calculates the sha512 sum of a string
[Link].sha512sumhex(x)
Calculates the sha512 sum of a string; returns hex-encoded

2.24 [Link]
itertools

Extension

of

standard

module

This module includes and extends the standard module itertools.


[Link](func, alphabet, length, method = upto, start = None)
Bruteforce func to return True. func should take a string input and return a bool(). func will be called with
strings from alphabet until it returns True or the search space has been exhausted.
The argument start can be used to split the search space, which is useful if multiple CPU cores are available.
Parameters
func (function) The function to bruteforce.
alphabet The alphabet to draw symbols from.
length Longest string to try.
method If upto try strings of length 1 .. length, if fixed only try strings of length
length and if downfrom try strings of length length .. 1.
start a tuple (i, N) which splits the search space up into N pieces d starts at piece i.
None is equivalent to (0, 1).
Returns A string s such that func(s) returns True or None if the search space was exhausted.
Example
>>> bruteforce(lambda x: x == hello, [Link], length = 10)
hello
>>> bruteforce(lambda x: x == hello, hllo, 5) is None
True

[Link](func)
A decorator chaining the results of func. Useful for generators.
Parameters func (function) The function being decorated.
Returns A generator function whoose elements are the concatenation of the return values from
func(*args, **kwargs).
Example
>>> @chained
... def g():
...
for x in count():
...
yield (x, -x)

114

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> take(6, g())


[0, 0, 1, -1, 2, -2]

[Link](n, iterator)
Advance the iterator n steps ahead. If n is :const:None, consume everything.
Parameters
n (int) Number of elements to consume.
iterator (iterator) An iterator.
Returns None.
Examples
>>>
>>>
>>>
5
>>>
>>>
>>>
[3,

i = count()
consume(5, i)
[Link]()
i = iter([1, 2, 3, 4, 5])
consume(2, i)
list(i)
4, 5]

[Link](n, iterable) iterator


Repeats the elements of iterable n times.
Parameters
n (int) The number of times to repeat iterable.
iterable An iterable.
Returns An iterator whoose elements are the elements of iterator repeated n times.
Examples
>>> take(4, cyclen(2, [1, 2]))
[1, 2, 1, 2]
>>> list(cyclen(10, []))
[]

[Link](x, y) int
Computes the dot product of x and y.
Parameters
x (iterable) An iterable.
x An iterable.
Returns The dot product of x and y, i.e.: x[0] * y[0] + x[1] * y[1] + ....
Example

2.24. [Link] Extension of standard module itertools

115

pwntools Documentation, Release 2.2

>>> dotproduct([1, 2, 3], [4, 5, 6])


... # 1 * 4 + 2 * 5 + 3 * 6 == 32
32

[Link](xss) iterator
Flattens one level of nesting; when xss is an iterable of iterables, returns an iterator whoose elements is the
concatenation of the elements of xss.
Parameters xss An iterable of iterables.
Returns An iterator whoose elements are the concatenation of the iterables in xss.
Examples
>>> list(flatten([[1, 2], [3, 4]]))
[1, 2, 3, 4]
>>> take(6, flatten([[43, 42], [41, 40], count()]))
[43, 42, 41, 40, 0, 1]

[Link](n, iterable, fill_value = None) iterator


Similar to [Link](), but returns an iterator and uses itertools fast build-in functions.
Parameters
n (int) The group size.
iterable An iterable.
fill_value The value to fill into the remaining slots of the last group if the n does not divide
the number of elements in iterable.
Returns An iterator whoose elements are n-tuples of the elements of iterable.
Examples
>>> list(group(2, range(5)))
[(0, 1), (2, 3), (4, None)]
>>> take(3, group(2, count()))
[(0, 1), (2, 3), (4, 5)]
>>> [.join(x) for x in group(3, ABCDEFG, x)]
[ABC, DEF, Gxx]

[Link].iter_except(func, exception)
Calls func repeatedly until an exception is raised. Works like the build-in iter() but uses an exception instead
of a sentinel to signal the end.
Parameters
func The function to call.
exception (exception) The exception that signals the end. Other exceptions will not be
caught.
Returns An iterator whoose elements are the results of calling func() until an exception matching
exception is raised.

116

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Examples
>>> s = {1, 2, 3}
>>> i = iter_except([Link], KeyError)
>>> [Link]()
1
>>> [Link]()
2
>>> [Link]()
3
>>> [Link]()
Traceback (most recent call last):
...
StopIteration
Traceback (most recent call last):
...
StopIteration

[Link](alphabet) iterator
The words with symbols in alphabet, in lexicographic order (determined by the order of alphabet).
Parameters alphabet The alphabet to draw symbols from.
Returns An iterator of the words with symbols in alphabet, in lexicographic order.
Example
>>> take(8, imap(lambda x: .join(x), lexicographic(01)))
[, 0, 1, 00, 01, 10, 11, 000]

[Link](n, iterable) object


Inspects the upcoming element at index n without advancing the iterator. Raises IndexError if iterable has
too few elements.
Parameters
n (int) Index of the element to return.
iterable An iterable.
Returns The element in iterable at index n.
Examples
>>>
>>>
4
>>>
0
>>>
>>>
4
>>>
5
>>>
10

i = count()
lookahead(4, i)
[Link]()
i = count()
nth(4, i)
[Link]()
lookahead(4, i)

2.24. [Link] Extension of standard module itertools

117

pwntools Documentation, Release 2.2

[Link](n, iterable, default = None) object


Returns the element at index n in iterable. If iterable is a iterator it will be advanced.
Parameters
n (int) Index of the element to return.
iterable An iterable.
default (objext) A default value.
Returns The element at index n in iterable or default if iterable has too few elements.
Examples
>>>
2
>>>
42
>>>
>>>
42
>>>
85

nth(2, [0, 1, 2, 3])


nth(2, [0, 1], 42)
i = count()
nth(42, i)
nth(42, i)

[Link](iterable, value = None) iterator


Pad an iterable with value, i.e. returns an iterator whoose elements are first the elements of iterable then value
indefinitely.
Parameters
iterable An iterable.
value The value to pad with.
Returns An iterator whoose elements are first the elements of iterable then value indefinitely.
Examples
>>> take(3, pad([1, 2]))
[1, 2, None]
>>> i = pad(iter([1, 2, 3]), 42)
>>> take(2, i)
[1, 2]
>>> take(2, i)
[3, 42]
>>> take(2, i)
[42, 42]

[Link](iterable) iterator
Parameters iterable An iterable.
Returns An iterator whoose elements are pairs of neighbouring elements of iterable.

118

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Examples
>>> list(pairwise([1, 2, 3, 4]))
[(1, 2), (2, 3), (3, 4)]
>>> i = starmap([Link], pairwise(count()))
>>> take(5, i)
[1, 3, 5, 7, 9]

[Link](iterable, include_empty = True) iterator


The powerset of an iterable.
Parameters
iterable An iterable.
include_empty (bool) Whether to include the empty set.
Returns The powerset of iterable as an interator of tuples.
Examples
>>> list(powerset(range(3)))
[(), (0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]
>>> list(powerset(range(2), include_empty = False))
[(0,), (1,), (0, 1)]

[Link](iterable, pred = bool) int


Count how many times the predicate pred is True.
Parameters
iterable An iterable.
pred A function that given an element from iterable returns either
Returns The number of elements in iterable for which pred returns True.
Examples
>>> quantify([1, 2, 3, 4], lambda x: x % 2 == 0)
2
>>> quantify([1, two, 3, 42], [Link])
3

[Link].random_combination(iterable, r) tuple
Parameters
iterable An iterable.
r (int) Size of the combination.
Returns A random element from [Link](iterable, r = r).
Examples

2.24. [Link] Extension of standard module itertools

119

pwntools Documentation, Release 2.2

>>> random_combination(range(2), 2)
(0, 1)
>>> random_combination(range(10), r = 2) in combinations(range(10), r = 2)
True

[Link].random_combination_with_replacement(iterable, r)
random_combination(iterable, r) -> tuple
Parameters
iterable An iterable.
r (int) Size of the combination.
Returns A random element from itertools.combinations_with_replacement(iterable,
r = r).
Examples
>>> cs = {(0, 0), (0, 1), (1, 1)}
>>> random_combination_with_replacement(range(2), 2) in cs
True
>>> i = combinations_with_replacement(range(10), r = 2)
>>> random_combination_with_replacement(range(10), r = 2) in i
True

[Link].random_permutation(iterable, r=None)
random_product(iterable, r = None) -> tuple
Parameters
iterable An iterable.
r (int) Size of the permutation. If None select all elements in iterable.
Returns A random element from [Link](iterable, r = r).
Examples
>>> random_permutation(range(2)) in {(0, 1), (1, 0)}
True
>>> random_permutation(range(10), r = 2) in permutations(range(10), r = 2)
True

[Link].random_product(*args, repeat = 1) tuple


Parameters
args One or more iterables
repeat (int) Number of times to repeat args.
Returns A random element from [Link](*args, repeat = repeat).
Examples

120

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> args = (range(2), range(2))


>>> random_product(*args) in {(0, 0), (0, 1), (1, 0), (1, 1)}
True
>>> args = (range(3), range(3), range(3))
>>> random_product(*args, repeat = 2) in product(*args, repeat = 2)
True

[Link].repeat_func(func, *args, **kwargs) iterator


Repeatedly calls func with positional arguments args and keyword arguments kwargs. If no keyword arguments
is given the resulting iterator will be computed using only functions from itertools which are very fast.
Parameters
func (function) The function to call.
args Positional arguments.
kwargs Keyword arguments.
Returns An iterator whoose elements are the results of calling func(*args, **kwargs) repeatedly.
Examples
>>> def f(x):
...
x[0] += 1
...
return x[0]
>>> i = repeat_func(f, [0])
>>> take(2, i)
[1, 2]
>>> take(2, i)
[3, 4]
>>> def f(**kwargs):
...
return [Link](x, 43)
>>> i = repeat_func(f, x = 42)
>>> take(2, i)
[42, 42]
>>> i = repeat_func(f, 42)
>>> take(2, i)
Traceback (most recent call last):
...
TypeError: f() takes exactly 0 arguments (1 given)
Traceback (most recent call last):
...
TypeError: f() takes exactly 0 arguments (1 given)

[Link](*iterables)
Take elements from iterables in a round-robin fashion.
Returns An iterator whoose elements are taken from iterables in a round-robin fashion.
Examples
>>> .join(roundrobin(ABC, D, EF))
ADEBFC
>>> .join(take(10, roundrobin(ABC, DE, repeat(x))))
ADxBExCxxx

2.24. [Link] Extension of standard module itertools

121

pwntools Documentation, Release 2.2

[Link](func, start = 0) iterator


Parameters
func (function) The function to tabulate over.
start (int) Number to start on.
Returns An iterator with the elements func(start), func(start + 1), ....
Examples
>>> take(2, tabulate(str))
[0, 1]
>>> take(5, tabulate(lambda x: x**2, start = 1))
[1, 4, 9, 16, 25]

[Link](n, iterable) list


Returns first n elements of iterable. If iterable is a iterator it will be advanced.
Parameters
n (int) Number of elements to take.
iterable An iterable.
Returns A list of the first n elements of iterable. If there are fewer than n elements in iterable they
will all be returned.
Examples
>>>
[0,
>>>
>>>
[0,
>>>
[2,
>>>
[1,

take(2, range(10))
1]
i = count()
take(2, i)
1]
take(2, i)
3]
take(9001, [1, 2, 3])
2, 3]

[Link].unique_everseen(iterable, key = None) iterator


Get unique elements, preserving order. Remember all elements ever seen. If key is not None then for each
element elm in iterable the element that will be rememberes is key(elm). Otherwise elm is remembered.
Parameters
iterable An iterable.
key A function to map over each element in iterable before remembering it. Setting to
None is equivalent to the identity function.
Returns An iterator of the unique elements in iterable.
Examples

122

Chapter 2. Module Index

pwntools Documentation, Release 2.2

>>> .join(unique_everseen(AAAABBBCCDAABBB))
ABCD
>>> .join(unique_everseen(ABBCcAD, [Link]))
ABCD

[Link].unique_justseen(iterable, key=None)
unique_everseen(iterable, key = None) -> iterator
Get unique elements, preserving order. Remember only the elements just seen. If key is not None then for each
element elm in iterable the element that will be rememberes is key(elm). Otherwise elm is remembered.
Parameters
iterable An iterable.
key A function to map over each element in iterable before remembering it. Setting to
None is equivalent to the identity function.
Returns An iterator of the unique elements in iterable.
Examples
>>> .join(unique_justseen(AAAABBBCCDAABBB))
ABCDAB
>>> .join(unique_justseen(ABBCcAD, [Link]))
ABCAD

[Link].unique_window(iterable, window, key=None)


unique_everseen(iterable, window, key = None) -> iterator
Get unique elements, preserving order. Remember only the last window elements seen. If key is not None
then for each element elm in iterable the element that will be rememberes is key(elm). Otherwise elm is
remembered.
Parameters
iterable An iterable.
window (int) The number of elements to remember.
key A function to map over each element in iterable before remembering it. Setting to
None is equivalent to the identity function.
Returns An iterator of the unique elements in iterable.
Examples
>>> .join(unique_window(AAAABBBCCDAABBB, 6))
ABCDA
>>> .join(unique_window(ABBCcAD, 5, [Link]))
ABCD
>>> .join(unique_window(ABBCcAD, 4, [Link]))
ABCAD

[Link]()
Alias for [Link]().
[Link]()
Alias for [Link]()

2.24. [Link] Extension of standard module itertools

123

pwntools Documentation, Release 2.2

[Link].combinations_with_replacement()
Alias for itertools.combinations_with_replacement()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link].izip_longest()
Alias for itertools.izip_longest()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()
[Link]()
Alias for [Link]()

2.25 [Link] Operations on lists


[Link](l) list
Concats a list of lists into a list.

124

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Example
>>> concat([[1, 2], [3]])
[1, 2, 3]

[Link].concat_all(*args) list
Concats all the arguments together.
Example
>>> concat_all(0, [1, (2, 3)], [([[4, 5, 6]])])
[0, 1, 2, 3, 4, 5, 6]

[Link](l, e) l
Generate all indices of needle in haystack, using the Knuth-Morris-Pratt algorithm.
Example
>>>
>>>
3
>>>
4
>>>
6

foo = findall([1,2,3,4,4,3,4,2,1], 4)
[Link]()
[Link]()
[Link]()

[Link](n, lst, underfull_action = ignore, fill_value = None) list


Split sequence into subsequences of given size. If the values cannot be evenly distributed among into groups,
then the last group will either be returned as is, thrown out or padded with the value specified in fill_value.
Parameters
n (int) The size of resulting groups
lst The list, tuple or string to group
underfull_action (str) The action to take in case of an underfull group at the end. Possible
values are ignore, drop or fill.
fill_value The value to fill into an underfull remaining group.
Returns A list containing the grouped values.
Example
>>> group(3, "ABCDEFG")
[ABC, DEF, G]
>>> group(3, ABCDEFG, drop)
[ABC, DEF]
>>> group(3, ABCDEFG, fill, Z)
[ABC, DEF, GZZ]
>>> group(3, list(ABCDEFG), fill)
[[A, B, C], [D, E, F], [G, None, None]]

[Link](s) list
Turns a string into a list of the corresponding ascii values.
2.25. [Link] Operations on lists

125

pwntools Documentation, Release 2.2

Example
>>> ordlist("hello")
[104, 101, 108, 108, 111]

[Link](lst, f, save_keys = False) list


Partitions an iterable into sublists using a function to specify which group they belong to.
It works by calling f on every element and saving the results into an [Link].
Parameters
lst The iterable to partition
f (function) The function to use as the partitioner.
save_keys (bool) Set this to True, if you want the OrderedDict returned instead of just the
values
Example
>>> partition([1,2,3,4,5], lambda x: x&1)
[[1, 3, 5], [2, 4]]

[Link](cs) str
Takes a list of ascii values and returns the corresponding string.
Example
>>> unordlist([104, 101, 108, 108, 111])
hello

2.26 [Link] We could not fit it any other place


[Link](alignment, x) int
Rounds x up to nearest multiple of the alignment.
Example
>>> [align(5, n) for n in range(15)]
[0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 15, 15, 15, 15]

[Link].align_down(alignment, x) int
Rounds x down to nearest multiple of the alignment.
Example
>>> [align_down(5, n) for n in range(15)]
[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10]

[Link].binary_ip(host) str
Resolve host and return IP as four byte string.
126

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Example
>>> binary_ip("[Link]")
\x7f\x00\x00\x01

[Link].mkdir_p(path)
Emulates the behavior of mkdir -p.
[Link].parse_ldd_output(output)
Parses the output from a run of ldd on a binary. Returns a dictionary of {path: address} for each library
required by the specified binary.
Parameters output (str) The output to parse
Example

>>> sorted(parse_ldd_output(
...
[Link].1 => (0x00007fffbf5fe000)
...
[Link].5 => /lib/x86_64-linux-gnu/[Link].5 (0x00007fe28117f000)
...
[Link].2 => /lib/x86_64-linux-gnu/[Link].2 (0x00007fe280f7b000)
...
[Link].6 => /lib/x86_64-linux-gnu/[Link].6 (0x00007fe280bb4000)
...
/lib64/[Link].2 (0x00007fe2813dd000)
... ).keys())
[/lib/x86_64-linux-gnu/[Link].6, /lib/x86_64-linux-gnu/[Link].2, /lib/x86_64-linux-gnu/l

[Link](path) str
Open file, return content.
Examples
>>> read(pwnlib/util/[Link]).split(\n)[0]
import socket, re, os, stat, errno, string, base64, logging

[Link].register_sizes(regs, in_sizes)
Create dictionaries over register sizes and relations
Given a list of lists of overlapping register names (e.g. [eax,ax,al,ah]) and a list of input sizes, it returns
the following:
all_regs : list of all valid registers
sizes[reg] : the size of reg in bits
bigger[reg] : list of overlapping registers bigger than reg
smaller[reg]: list of overlapping registers smaller than reg
Used in i386/AMD64 shellcode, e.g. the mov-shellcode.
Example
>>>
...
...
...
...

regs = [[eax, ax, al, ah],[ebx, bx, bl, bh],


[ecx, cx, cl, ch],
[edx, dx, dl, dh],
[edi, di],
[esi, si],

2.26. [Link] We could not fit it any other place

127

pwntools Documentation, Release 2.2

... [ebp, bp],


... [esp, sp],
... ]
>>> all_regs, sizes, bigger, smaller = register_sizes(regs, [32, 16, 8, 8])
>>> all_regs
[eax, ax, al, ah, ebx, bx, bl, bh, ecx, cx, cl, ch, edx, dx, dl,
>>> sizes
{ch: 8, cl: 8, ah: 8, edi: 32, al: 8, cx: 16, ebp: 32, ax: 16, edx: 32, ebx:
>>> bigger
{ch: [ecx, cx, ch], cl: [ecx, cx, cl], ah: [eax, ax, ah], edi: [edi]
>>> smaller
{ch: [], cl: [], ah: [], edi: [di], al: [], cx: [cl, ch], ebp: [bp], ax:

[Link].run_in_new_terminal(command, terminal = None) None


Run a command in a new terminal.
If X11 is detected, the terminal will be launched with x-terminal-emulator.
If X11 is not detected, a new tmux pane is opened if possible.
Parameters
command (str) The command to run.
terminal (str) Which terminal to use.
args (list) Arguments to pass to the terminal
Returns None
[Link].sh_string(s)
Outputs a string in a format that will be understood by /bin/sh.
If the string does not contain any bad characters, it will simply be returned, possibly with quotes. If it contains
bad characters, it will be escaped in a way which is compatible with most known systems.
Examples

>>> print sh_string(foobar)


foobar
>>> print sh_string(foo bar)
foo bar
>>> print sh_string("foobar")
"foobar"
>>> print sh_string("foo\\bar")
foo\bar
>>> print sh_string("foo\\bar")
"foo\\bar"
>>> print sh_string("foo\x01bar")
"$( (echo Zm9vASdiYXI=|(base64 -d||openssl enc -d -base64)||echo -en foo\x01\x27bar) 2>/dev/nu
>>> print subprocess.check_output("echo -n " + sh_string("foo\\bar"), shell = True)
foo\bar

[Link](n, abbriv = B, si = False) str


Convert the length of a bytestream to human readable form.
Parameters n (int,str) The length to convert to human readable form

128

Chapter 2. Module Index

pwntools Documentation, Release 2.2

Example
>>> size(451)
451B
>>> size(1000)
1000B
>>> size(1024)
1.00KB
>>> size(1024, si = True)
1.02KB
>>> [size(1024 ** n) for n in range(7)]
[1B, 1.00KB, 1.00MB, 1.00GB, 1.00TB, 1.00PB, 1024.00PB]

[Link](name, flags = os.X_OK, all = False) str or str set


Works as the system command which; searches $PATH for name and returns a full path if found.
If all is True the set of all found locations is returned, else the first occurence or None is returned.
Returns If all is True the set of all locations where name was found, else the first location or None
if not found.
Example
>>> which(sh)
/bin/sh

[Link](path, data=, create_dir=False)


Create new file or truncate existing to zero length and write data.

2.27 [Link] Networking interfaces


[Link]() dict list
A wrapper for libcs getifaddrs.
Returns list of dictionaries each representing a struct ifaddrs. The dictionaries have the fields
name, flags, family, addr and netmask. Refer to getifaddrs(3) for details. The fields addr
and netmask are themselves dictionaries. Their structure depend on family. If family is not
socket.AF_INET or socket.AF_INET6 they will be empty.
[Link](all = False) dict
Parameters
all (bool) Whether to include interfaces with not associated address.
Default False.
Returns A dictionary mapping each of the hosts interfaces to a list of its addresses. Each entry in the list is a tuple (family, addr), and family is either socket.AF_INET or
socket.AF_INET6.
[Link].interfaces4(all = False) dict
As interfaces() but only includes IPv4 addresses and the lists in the dictionary only contains the addresses
not the family.
Parameters
all (bool) Whether to include interfaces with not associated address.
2.27. [Link] Networking interfaces

129

pwntools Documentation, Release 2.2

Default False.
Returns A dictionary mapping each of the hosts interfaces to a list of its IPv4 addresses.
[Link].interfaces6(all = False) dict
As interfaces() but only includes IPv6 addresses and the lists in the dictionary only contains the addresses
not the family.
Parameters
all (bool) Whether to include interfaces with not associated address.
Default False.
Returns A dictionary mapping each of the hosts interfaces to a list of its IPv6 addresses.

2.28 [Link] Packing and unpacking of strings


Module for packing and unpacking integers.
Simplifies access to the standard [Link] and [Link] functions, and also adds support for packing/unpacking arbitrary-width integers.
The packers are all context-aware for endian and signed arguments, though they can be overridden in the parameters.
Examples
>>> p8(0)
\x00
>>> p32(0xdeadbeef)
\xef\xbe\xad\xde
>>> p32(0xdeadbeef, endian=big)
\xde\xad\xbe\xef
>>> with [Link](endian=big): p32(0xdeadbeef)
\xde\xad\xbe\xef

Make a frozen packer, which does not change with context.


>>> p=make_packer(all)
>>> p(0xff)
\xff
>>> p(0x1ff)
\xff\x01
>>> with [Link](endian=big): print repr(p(0x1ff))
\xff\x01

[Link](*args, preprocessor = None, word_size = None, endianness = None, sign


= None)
Flattens the arguments into a string.
This function takes an arbitrary number of arbitrarily nested lists and tuples. It will then find every string and
number inside those and flatten them out. Strings are inserted directly while numbers are packed using the
pack() function.
The three kwargs word_size, endianness and sign will default to using values in [Link] if not
specified as an argument.
Parameters

130

Chapter 2. Module Index

pwntools Documentation, Release 2.2

args Values to flatten


preprocessor (function) Gets called on every element to optionally transform the element
before flattening. If None is returned, then the original value is uded.
word_size (int) Word size of the converted integer.
endianness (str) Endianness of the converted integer (little/big).
sign (str) Signedness of the converted integer (False/True)
Examples
>>> flat(1, "test", [[["AB"]*2]*3], endianness = little, word_size = 16, sign = False)
\x01\x00testABABABABABAB
>>> flat([1, [2, 3]], preprocessor = lambda x: str(x+1))
234

[Link].make_packer(word_size = None, endianness = None, sign = None) number str


Creates a packer by freezing the given arguments.
Semantically calling make_packer(w, e, s)(data) is equivalent to calling pack(data, w, e,
s). If word_size is one of 8, 16, 32 or 64, it is however faster to call this function, since it will then use a
specialized version.
Parameters
word_size (int) The word size to be baked into the returned packer or the string all.
endianness (str) The endianness to be baked into the returned packer. (little/big)
sign (str) The signness to be baked into the returned packer. (unsigned/signed)
kwargs Additional context flags, for setting by alias (e.g. endian= rather than index)
Returns A function, which takes a single argument in the form of a number and returns a string of
that number in a packed form.
Examples
>>> p = make_packer(32, little, unsigned)
>>> p
<function _p32lu at 0x...>
>>> p(42)
*\x00\x00\x00
>>> p(-1)
Traceback (most recent call last):
...
error: integer out of range for I format code
>>> make_packer(33, little, unsigned)
<function <lambda> at 0x...>
Traceback (most recent call last):
...
error: integer out of range for I format code

[Link].make_unpacker(word_size = None, endianness = None, sign = None,


**kwargs) str number
Creates a unpacker by freezing the given arguments.

2.28. [Link] Packing and unpacking of strings

131

pwntools Documentation, Release 2.2

Semantically calling make_unpacker(w, e, s)(data) is equivalent to calling unpack(data, w,


e, s). If word_size is one of 8, 16, 32 or 64, it is however faster to call this function, since it will then use a
specialized version.
Parameters
word_size (int) The word size to be baked into the returned packer.
endianness (str) The endianness to be baked into the returned packer. (little/big)
sign (str) The signness to be baked into the returned packer. (unsigned/signed)
kwargs Additional context flags, for setting by alias (e.g. endian= rather than index)
Returns A function, which takes a single argument in the form of a string and returns a number of
that string in an unpacked form.
Examples
>>> u = make_unpacker(32, little, unsigned)
>>> u
<function _u32lu at 0x...>
>>> hex(u(/bin))
0x6e69622f
>>> u(abcde)
Traceback (most recent call last):
...
error: unpack requires a string argument of length 4
>>> make_unpacker(33, little, unsigned)
<function <lambda> at 0x...>
Traceback (most recent call last):
...
error: unpack requires a string argument of length 4

[Link].p16(number, **kwargs) str


Packs an 16-bit integer
Parameters
number (int) Number to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The packed number as a string
[Link].p32(number, **kwargs) str
Packs an 32-bit integer
Parameters
number (int) Number to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The packed number as a string

132

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link].p64(number, **kwargs) str


Packs an 64-bit integer
Parameters
number (int) Number to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The packed number as a string
[Link].p8(number, **kwargs) str
Packs an 8-bit integer
Parameters
number (int) Number to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The packed number as a string
[Link](number, word_size = None, endianness = None, sign = None, **kwargs)
str
Packs arbitrary-sized integer.
Word-size, endianness and signedness is done according to context.
word_size can be any positive number or the string all. Choosing the string all will output a string long
enough to contain all the significant bits and thus be decodable by unpack().
word_size can be any positive number. The output will contain word_size/8 rounded up number of bytes. If
word_size is not a multiple of 8, it will be padded with zeroes up to a byte boundary.
Parameters
number (int) Number to convert
word_size (int) Word size of the converted integer or the string all.
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (False/True)
kwargs Anything that can be passed to [Link]
Returns The packed number as a string.
Examples
>>> pack(0x414243, 24,
ABC
>>> pack(0x414243, 24,
CBA
>>> pack(0x814243, 24,
\x81BC
>>> pack(0x814243, 24,
Traceback (most recent

big, True)
little, True)
big, False)
big, True)
call last):

2.28. [Link] Packing and unpacking of strings

133

pwntools Documentation, Release 2.2

...
ValueError: pack(): number does not fit within word_size
>>> pack(0x814243, 25, big, True)
\x00\x81BC
>>> pack(-1, all, little, True)
\xff
>>> pack(-256, all, big, True)
\xff\x00
>>> pack(0x0102030405, all, little, True)
\x05\x04\x03\x02\x01
Traceback (most recent call last):
...
ValueError: pack(): number does not fit within word_size

[Link](number, endianness=None, sign=None, **kwargs)


u32(number, **kwargs) -> int
Unpacks an 32-bit integer
Parameters
data (str) String to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The unpacked number
[Link].u16(number, **kwargs) int
Unpacks an 16-bit integer
Parameters
data (str) String to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The unpacked number
[Link].u32(number, **kwargs) int
Unpacks an 32-bit integer
Parameters
data (str) String to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The unpacked number
[Link].u64(number, **kwargs) int
Unpacks an 64-bit integer
Parameters
data (str) String to convert

134

Chapter 2. Module Index

pwntools Documentation, Release 2.2

endianness (str) Endianness of the converted integer (little/big)


sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The unpacked number
[Link].u8(number, **kwargs) int
Unpacks an 8-bit integer
Parameters
data (str) String to convert
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (unsigned/signed)
kwargs (dict) Arguments passed to [Link](), such as endian or signed.
Returns The unpacked number
[Link](data, word_size = None, endianness = None, sign = None, **kwargs)
int
Packs arbitrary-sized integer.
Word-size, endianness and signedness is done according to context.
word_size can be any positive number or the string all.
len(data)*8.

Choosing the string all is equivalent to

If word_size is not a multiple of 8, then the bits used for padding are discarded.
Parameters
number (int) String to convert
word_size (int) Word size of the converted integer or the string all.
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (False/True)
kwargs Anything that can be passed to [Link]
Returns The unpacked number.
Examples
>>> hex(unpack(\xaa\x55, 16,
0x55aa
>>> hex(unpack(\xaa\x55, 16,
0xaa55
>>> hex(unpack(\xaa\x55, 16,
-0x55ab
>>> hex(unpack(\xaa\x55, 15,
0x2a55
>>> hex(unpack(\xff\x02\x03,
0x302ff
>>> hex(unpack(\xff\x02\x03,
-0xfdfd

little, False))
big, False))
big, True))
big, True))
all, little, True))
all, big, True))

2.28. [Link] Packing and unpacking of strings

135

pwntools Documentation, Release 2.2

[Link].unpack_many(data, word_size=None, endianness=None,


**kwargs)
unpack(data, word_size = None, endianness = None, sign = None) -> int list

sign=None,

Splits data into groups of word_size//8 bytes and calls unpack() on each group. Returns a list of the
results.
word_size must be a multiple of 8 or the string all. In the latter case a singleton list will always be returned.
Parameters
number (int) String to convert
word_size (int) Word size of the converted integers or the string all.
endianness (str) Endianness of the converted integer (little/big)
sign (str) Signedness of the converted integer (False/True)
kwargs Anything that can be passed to [Link]
Returns The unpacked numbers.
Examples
>>> map(hex, unpack_many(\xaa\x55\xcc\x33, 16, little, False))
[0x55aa, 0x33cc]
>>> map(hex, unpack_many(\xaa\x55\xcc\x33, 16, big, False))
[0xaa55, 0xcc33]
>>> map(hex, unpack_many(\xaa\x55\xcc\x33, 16, big, True))
[-0x55ab, -0x33cd]
>>> map(hex, unpack_many(\xff\x02\x03, all, little, True))
[0x302ff]
>>> map(hex, unpack_many(\xff\x02\x03, all, big, True))
[-0xfdfd]

2.29 [Link] Working with /proc/


[Link](pid) int list
Parameters pid (int) PID of the process.
Returns List of PIDs of whose parent process is pid or an ancestor of pid.
[Link](ppid) int list
Parameters pid (int) PID of the process.
Returns List of PIDs of whose parent process is pid.
[Link](pid) str list
Parameters pid (int) PID of the process.
Returns A list of the fields in /proc/<pid>/cmdline.
[Link](pid) str
Parameters pid (int) PID of the process.
Returns The path of the processs current working directory. I.e. what /proc/<pid>/cwd points
to.
136

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link](pid) dict
Parameters pid (int) PID of the process.
Returns Dictionary mapping the PID of each child of pid to its descendants.
[Link](pid) str
Parameters pid (int) PID of the process.
Returns The path of the binary of the process. I.e. what /proc/<pid>/exe points to.
[Link](pid) str
Parameters pid (int) PID of the process.
Returns Name of process as listed in /proc/<pid>/status.
Example
>>> name([Link]()) == [Link]([Link][0])
True

[Link](pid) int
Parameters pid (int) PID of the process.
Returns Parent PID as listed in /proc/<pid>/status under PPid, or 0 if there is not parent.
[Link].pid_by_name(name) int list
Parameters name (str) Name of program.
Returns List of PIDs matching name sorted by lifetime, youngest to oldest.
Example
>>> [Link]() in pid_by_name(name([Link]()))
True

[Link](target) int list


Get PID(s) of target. The returned PID(s) depends on the type of target:
str: PIDs of all processes with a name matching target.
[Link]: singleton list of the PID of target.
[Link]: singleton list of the PID at the
remote end of target if it is running on the host. Otherwise an empty list.
Parameters target (object) The target whose PID(s) to find.
Returns A list of found PIDs.
[Link](pid) float
Parameters pid (int) PID of the process.
Returns The time (in seconds) the process started after system boot
[Link](pid) str list
Parameters pid (int) PID of the process.
2.29. [Link] Working with /proc/

137

pwntools Documentation, Release 2.2

Returns A list of the values in /proc/<pid>/stat, with the exception that ( and ) has been
removed from around the process name.
[Link](pid) str
Parameters pid (int) PID of the process.
Returns State of the process as listed in /proc/<pid>/status. See proc(5) for details.
Example
>>> state([Link]())
R (running)

[Link](pid) dict
Get the status of a process.
Parameters pid (int) PID of the process.
Returns The contents of /proc/<pid>/status as a dictionary.
[Link](pid) int
Parameters pid (int) PID of the process.
Returns PID of the process tracing pid, or None if no pid is not being traced.
Example
>>> tracer([Link]()) is None
True

[Link].wait_for_debugger(pid) None
Sleeps until the process with PID pid is being traced.
Parameters pid (int) PID of the process.
Returns None

2.30 [Link] Safe evaluation of python code


[Link](expression) value
Safe Python constant evaluation
Evaluates a string that contains an expression describing a Python constant. Strings that are not valid Python
expressions or that contain other code besides the constant raise ValueError.
>>> const("10")
10
>>> const("[1,2, (3,4), {foo:bar}]")
[1, 2, (3, 4), {foo: bar}]
>>> const("[1]+[2]")
Traceback (most recent call last):
...
ValueError: opcode BINARY_ADD not allowed
Traceback (most recent call last):
...
ValueError: opcode BINARY_ADD not allowed

138

Chapter 2. Module Index

pwntools Documentation, Release 2.2

[Link](expression) value
Safe Python expression evaluation
Evaluates a string that contains an expression that only uses Python constants. This can be used to e.g. evaluate
a numerical expression from an untrusted source.
>>> expr("1+2")
3
>>> expr("[1,2]*2")
[1, 2, 1, 2]
>>> expr("__import__(sys).modules")
Traceback (most recent call last):
...
ValueError: opcode LOAD_NAME not allowed
Traceback (most recent call last):
...
ValueError: opcode LOAD_NAME not allowed

[Link].test_expr(expr, allowed_codes) codeobj


Test that the expression contains only the listed opcodes. If the expression is valid and contains only allowed
codes, return the compiled code object. Otherwise raise a ValueError

2.31 [Link] Utilities for working with the WWW


[Link](url, save=None, timeout=5) str
Downloads a file via HTTP/HTTPS.
Parameters
url (str) URL to download
save (str or bool) Name to save as. Any truthy value will auto-generate a name based on
the URL.
timeout (int) Timeout, in seconds
Example
>>> url
= [Link]
>>> with [Link](log_level=ERROR):
...
result = wget(url)
>>> result
User-agent: *\nDisallow: /deny\n
>>> with [Link](log_level=ERROR):
...
_ = wget(url, True)
>>> result == file([Link]).read()
True

2.31. [Link] Utilities for working with the WWW

139

pwntools Documentation, Release 2.2

140

Chapter 2. Module Index

CHAPTER 3

Indices and tables

genindex
modindex
search

141

pwntools Documentation, Release 2.2

142

Chapter 3. Indices and tables

Python Module Index

p
pwn, 3
pwnlib, 3
[Link], 17
[Link], 19
[Link], 20
[Link], 20
[Link], 29
[Link], 31
[Link], 35
[Link], 35
[Link], 37
[Link], 38
[Link], 43
[Link], 44
[Link], 45
[Link].amd64, 46
[Link], 48
[Link], 49
[Link], 50
[Link], 50
[Link].i386, 50
[Link], 55
[Link], 53
[Link], 55
[Link], 56
[Link], 56
[Link], 56
[Link], 58
[Link], 59
[Link], 59
[Link], 58
[Link], 59
[Link], 60
[Link], 65
[Link], 76
[Link], 76
[Link], 77
[Link], 107
[Link], 108

[Link], 112
[Link], 114
[Link], 124
[Link], 126
[Link], 129
[Link], 130
[Link], 136
[Link], 138
[Link], 139

143

pwntools Documentation, Release 2.2

144

Python Module Index

Index

Symbols
color <color>
phd command line option, 15
-?, show
shellcraft command line option, 15
-a <alphabet>, alphabet <alphabet>
cyclic command line option, 13
-c <<opt>>, context <<opt>>
asm command line option, 12
constgrep command line option, 13
disasm command line option, 13
-c <count>, count <count>
phd command line option, 14
-e <<constant name>>, exact <<constant name>>
constgrep command line option, 13
-f <<format>>, format <<format>>
shellcraft command line option, 15
-f <format>, format <format>
asm command line option, 12
-h, help
asm command line option, 12
constgrep command line option, 13
cyclic command line option, 13
disasm command line option, 13
elfdiff command line option, 14
elfpatch command line option, 14
hex command line option, 14
phd command line option, 14
shellcraft command line option, 15
unhex command line option, 15
-i, case-insensitive
constgrep command line option, 13
-l <<lookup value>>, -o <<lookup value>>, offset
<<lookup value>>, lookup <<lookup value>>
cyclic command line option, 13
-l <highlight>, highlight <highlight>
phd command line option, 14
-m, mask-mode
constgrep command line option, 13
-n <length>, length <length>

cyclic command line option, 13


-o <<file>>, out <<file>>
shellcraft command line option, 15
-o <file>, output <file>
asm command line option, 12
-o <offset>, offset <offset>
phd command line option, 15
-s <skip>, skip <skip>
phd command line option, 14
-w <width>, width <width>
phd command line option, 14
__call__() ([Link] method), 23
__call__() ([Link] method), 60
__enter__() ([Link] method), 65
__exit__() ([Link] method), 65
__getattr__() ([Link] method), 44
__getattr__() ([Link] method), 60
__getitem__() ([Link] method), 61
__lshift__() ([Link] method), 65
__ne__() ([Link] method), 66
__rshift__() ([Link] method), 66
__str__() ([Link] method), 44

A
a
elfdiff command line option, 14
acceptloop_ipv4()
(in
module
[Link]), 55
acceptloop_ipv4()
(in
module
[Link]), 53
address ([Link] attribute), 32
align() (in module [Link]), 126
align_down() (in module [Link]), 126
ancestors() (in module [Link]), 136
arc() (in module [Link]), 78
arch ([Link] attribute), 23
architectures ([Link] attribute), 24
asm command line option
-c <<opt>>, context <<opt>>, 12
-f <format>, format <format>, 12
-h, help, 12
145

pwntools Documentation, Release 2.2

-o <file>, output <file>, 12


line, 12
asm() (in module [Link]), 17
asm() ([Link] method), 32
attach() (in module [Link]), 35

concat_all() (in module [Link]), 125


connect_both() ([Link] method), 67
connect_input() ([Link] method), 67
connect_output() ([Link] method), 67
connect_remote() ([Link] method), 61
connected() ([Link] method), 61
B
connected() ([Link] method), 68
connected_raw() ([Link] method), 68
b
const() (in module [Link]), 138
elfdiff command line option, 14
constant
b() ([Link] method), 39
constgrep command line option, 13
b64d() (in module [Link]), 108
constgrep command line option
b64e() (in module [Link]), 108
-c <<opt>>, context <<opt>>, 13
bases() ([Link] method), 31
-e <<constant name>>, exact <<constant name>>,
binary_ip() (in module [Link]), 126
13
bindsh() (in module [Link]), 56
-h, help, 13
bits ([Link] attribute), 24
-i, case-insensitive, 13
bits() (in module [Link]), 108
-m, mask-mode, 13
bits_str() (in module [Link]), 109
constant, 13
bitswap() (in module [Link]), 109
regex, 13
bitswap_int() (in module [Link]), 109
consume() (in module [Link]), 115
breakpoint() (in module [Link].i386), 50
context (in module [Link]), 21
bruteforce() (in module [Link]), 114
ContextType (class in [Link]), 21
bss() ([Link] method), 32
[Link] (class in [Link]), 22
build() ([Link] method), 44
copy() ([Link] method), 25
bytes
count
elfpatch command line option, 14
cyclic command line option, 13
bytes ([Link] attribute), 24
count() (in module [Link]), 124
countdown() ([Link] method), 57
C
cpp() (in module [Link]), 18
call() ([Link] method), 44
crc_10() (in module [Link]), 78
can_init() (in module [Link]), 56
crc_10_cdma2000() (in module [Link]), 79
can_recv() ([Link] method), 66
crc_11() (in module [Link]), 79
chain() (in module [Link]), 123
crc_12_3gpp() (in module [Link]), 79
chain() ([Link] method), 45
crc_12_cdma2000() (in module [Link]), 80
chained() (in module [Link]), 114
crc_12_dect() (in module [Link]), 80
children() (in module [Link]), 136
crc_13_bbc() (in module [Link]), 81
cksum() (in module [Link]), 77
crc_14_darc() (in module [Link]), 81
clean() ([Link] method), 66
crc_15() (in module [Link]), 82
clean_and_log() ([Link] method), 67
crc_15_mpt1327() (in module [Link]), 82
clear() ([Link] method), 25
crc_16_aug_ccitt() (in module [Link]), 82
clearb() ([Link] method), 39
crc_16_buypass() (in module [Link]), 83
cleard() ([Link] method), 40
crc_16_ccitt_false() (in module [Link]), 83
clearq() ([Link] method), 40
crc_16_cdma2000() (in module [Link]), 84
clearw() ([Link] method), 40
crc_16_dds_110() (in module [Link]), 84
close() ([Link] method), 61
crc_16_dect_r() (in module [Link]), 84
close() ([Link] method), 67
crc_16_dect_x() (in module [Link]), 85
cmdline() (in module [Link]), 136
crc_16_dnp() (in module [Link]), 85
combinations() (in module [Link]), 123
combinations_with_replacement() (in module pwn- crc_16_en_13757() (in module [Link]), 86
crc_16_genibus() (in module [Link]), 86
[Link]), 123
communicate() ([Link] method), crc_16_maxim() (in module [Link]), 86
crc_16_mcrf4xx() (in module [Link]), 87
60
crc_16_riello() (in module [Link]), 87
compress() (in module [Link]), 124
crc_16_t10_dif() (in module [Link]), 88
concat() (in module [Link]), 124
146

Index

pwntools Documentation, Release 2.2

crc_16_teledisk() (in module [Link]), 88


crc_16_tms37157() (in module [Link]), 88
crc_16_usb() (in module [Link]), 89
crc_24() (in module [Link]), 89
crc_24_flexray_a() (in module [Link]), 90
crc_24_flexray_b() (in module [Link]), 90
crc_31_philips() (in module [Link]), 90
crc_32() (in module [Link]), 91
crc_32_bzip2() (in module [Link]), 91
crc_32_mpeg_2() (in module [Link]), 92
crc_32_posix() (in module [Link]), 92
crc_32c() (in module [Link]), 92
crc_32d() (in module [Link]), 93
crc_32q() (in module [Link]), 93
crc_3_rohc() (in module [Link]), 94
crc_40_gsm() (in module [Link]), 94
crc_4_itu() (in module [Link]), 94
crc_5_epc() (in module [Link]), 95
crc_5_itu() (in module [Link]), 95
crc_5_usb() (in module [Link]), 96
crc_64() (in module [Link]), 96
crc_64_we() (in module [Link]), 96
crc_64_xz() (in module [Link]), 97
crc_6_cdma2000_a() (in module [Link]), 97
crc_6_cdma2000_b() (in module [Link]), 98
crc_6_darc() (in module [Link]), 98
crc_6_itu() (in module [Link]), 98
crc_7() (in module [Link]), 99
crc_7_rohc() (in module [Link]), 99
crc_8() (in module [Link]), 100
crc_82_darc() (in module [Link]), 100
crc_8_cdma2000() (in module [Link]), 100
crc_8_darc() (in module [Link]), 101
crc_8_dvb_s2() (in module [Link]), 101
crc_8_ebu() (in module [Link]), 102
crc_8_i_code() (in module [Link]), 102
crc_8_itu() (in module [Link]), 102
crc_8_maxim() (in module [Link]), 103
crc_8_rohc() (in module [Link]), 103
crc_8_wcdma() (in module [Link]), 104
crc_a() (in module [Link]), 104
cwd() (in module [Link]), 136
cycle() (in module [Link]), 124
cyclen() (in module [Link]), 115
cyclic command line option
-a <alphabet>, alphabet <alphabet>, 13
-h, help, 13
-l <<lookup value>>, -o <<lookup value>>, offset
<<lookup value>>, lookup <<lookup value>>,
13
-n <length>, length <length>, 13
count, 13
cyclic() (in module [Link]), 107
cyclic_find() (in module [Link]), 107

Index

D
d() ([Link] method), 41
data
hex command line option, 14
de_bruijn() (in module [Link]), 108
debug() (in module [Link]), 35
debug() ([Link] method), 38
default ([Link] attribute), 57
defaults ([Link] attribute), 25
descendants() (in module [Link]), 136
disasm command line option
-c <<opt>>, context <<opt>>, 13
-h, help, 13
hex, 13
disasm() (in module [Link]), 18
disasm() ([Link] method), 32
dotproduct() (in module [Link]), 115
download_data() ([Link] method), 62
download_dir() ([Link] method), 62
download_file() ([Link] method), 62
dropwhile() (in module [Link]), 124
dump() ([Link] method), 45
dup() (in module [Link]), 48
dup() (in module [Link]), 53
dup() (in module [Link]), 56
dupsh() (in module [Link]), 48
dupsh() (in module [Link]), 53
dupsh() (in module [Link]), 56
dwarf ([Link] attribute), 32
dynamic ([Link] attribute), 31
DynELF (class in [Link]), 30

E
echo() (in module [Link]), 48
echo() (in module [Link]), 53
egghunter() (in module [Link]), 50
elf
elfpatch command line option, 14
ELF (class in [Link]), 31
elfclass ([Link] attribute), 31
elfclass ([Link] attribute), 32
elfdiff command line option
-h, help, 14
a, 14
b, 14
elfpatch command line option
-h, help, 14
bytes, 14
elf, 14
offset, 14
elftype ([Link] attribute), 32
endian ([Link] attribute), 25
endianness ([Link] attribute), 26
endiannesses ([Link] attribute), 26
147

pwntools Documentation, Release 2.2

enhex() (in module [Link]), 109


entry ([Link] attribute), 32
entrypoint ([Link] attribute), 32
error() ([Link] method), 38
exe() (in module [Link]), 137
executable_segments ([Link] attribute), 33
expr() (in module [Link]), 138

generic_crc() (in module [Link]), 77


get_data() ([Link] method), 33
getall() (in module [Link]), 76
getdents() (in module [Link]), 53
getifaddrs() (in module [Link]), 129
gnu_hash() (in module [Link]), 31
group() (in module [Link]), 116
group() (in module [Link]), 125
groupby() (in module [Link]), 124

kermit() (in module [Link]), 105


kill() ([Link] method), 60
kill() ([Link].ssh_channel method), 65

i386_to_amd64()
(in
module
[Link]), 55
i386_to_amd64()
(in
module
[Link]), 53
ifilter() (in module [Link]), 124
ifilterfalse() (in module [Link]), 124
imap() (in module [Link]), 124
F
indented() ([Link] method), 38
failure() ([Link] method), 38
infloop() (in module [Link].amd64), 46
field() ([Link] method), 41
infloop() (in module [Link]), 49
file
infloop() (in module [Link].i386), 50
phd command line option, 14
infloop() (in module [Link]), 55
fileno() ([Link] method), 68
info() ([Link] method), 38
find_base() ([Link] static method), 31
info_once() ([Link] method), 38
find_crc_function() (in module [Link]), 78
init() (in module [Link]), 56
find_module_addresses() (in module [Link]), 36
interactive() ([Link] method), 62
findall() (in module [Link]), 125
interactive() ([Link].ssh_channel method), 65
findpeer() (in module [Link]), 53
interactive() ([Link] method), 68
findpeer() (in module [Link]), 56
interfaces() (in module [Link]), 129
findpeersh() (in module [Link]), 53 interfaces4() (in module [Link]), 129
findpeersh() (in module [Link]), interfaces6() (in module [Link]), 130
56
islice() (in module [Link]), 124
findpeerstager() (in module [Link]), isprint() (in module [Link]), 110
53
iter_except() (in module [Link]), 116
flat() (in module [Link]), 130
izip() (in module [Link]), 124
flatten() (in module [Link]), 116
izip_longest() (in module [Link]), 124
forever ([Link] attribute), 57
fromsocket() ([Link] class method), J
59
jamcrc() (in module [Link]), 104

H
hex
disasm command line option, 13
unhex command line option, 15
hex command line option
-h, help, 14
data, 14
hexdump_iter() (in module [Link]), 109
hexii() (in module [Link]), 110

148

L
label() (in module [Link]), 50
lexicographic() (in module [Link]), 117
libs() ([Link] method), 62
line
asm command line option, 12
link_map ([Link] attribute), 31
listen (class in [Link]), 59
listen() (in module [Link]), 56
listen_remote() ([Link] method), 62
load() (in module [Link]), 31
local() ([Link] method), 26
local() ([Link] method), 57
log_level ([Link] attribute), 27
Logger (class in [Link]), 37
lookahead() (in module [Link]), 117
lookup() ([Link] method), 31

Index

pwntools Documentation, Release 2.2

permutations() (in module [Link]), 124


phd command line option
make_packer() (in module [Link]), 131
color <color>, 15
make_unpacker() (in module [Link]), 131
-c <count>, count <count>, 14
maximum ([Link] attribute), 58
-h, help, 14
md5file() (in module [Link]), 112
-l <highlight>, highlight <highlight>, 14
md5filehex() (in module [Link]), 113
-o <offset>, offset <offset>, 15
md5sum() (in module [Link]), 113
-s <skip>, skip <skip>, 14
md5sumhex() (in module [Link]), 113
-w <width>, width <width>, 14
MemLeak (class in [Link]), 38
file, 14
migrate() ([Link] method), 45
pid_by_name()
(in module [Link]), 137
mkdir_p() (in module [Link]), 127
pidof()
(in
module
[Link]), 137
modbus() (in module [Link]), 105
poll()
([Link]
method), 60
more() (in module [Link]), 76
poll()
([Link].ssh_channel
method), 65
mov() (in module [Link].amd64), 46
powerset()
(in
module
[Link]),
119
mov() (in module [Link]), 49
process
(class
in
[Link]),
59
mov() (in module [Link].i386), 50
product() (in module [Link]), 124
mov() (in module [Link]), 55
mprotect_all() (in module [Link]), progress() ([Link] method), 38
push() (in module [Link].amd64), 47
54
push() (in module [Link].i386), 51
pushstr() (in module [Link].amd64), 47
N
pushstr() (in module [Link].i386), 51
n() ([Link] method), 41
pushstr() (in module [Link]), 55
name() (in module [Link]), 137
pwn (module), 3
newline ([Link] attribute), 69
pwnlib (module), 3
non_writable_segments ([Link] attribute), 33
[Link] (module), 17
nop() (in module [Link].amd64), 47
[Link] (module), 19
nop() (in module [Link]), 49
[Link] (module), 20
nop() (in module [Link].i386), 51
[Link] (module), 20
nop() (in module [Link]), 55
[Link] (module), 29
nth() (in module [Link]), 117
[Link] (module), 31
[Link] (module), 35
O
[Link] (module), 35
offset
[Link] (module), 37
elfpatch command line option, 14
[Link] (module), 38
offset_to_vaddr() ([Link] method), 33
[Link] (module), 43
open_file() (in module [Link]), 50
[Link] (module), 44
options() (in module [Link]), 76
[Link] (module), 45
ordlist() (in module [Link]), 125
[Link].amd64 (module), 46
os ([Link] attribute), 27
[Link] (module), 48
oses ([Link] attribute), 27
[Link] (module), 49
[Link] (module), 50
P
[Link] (module), 50
p16() (in module [Link]), 132
[Link].i386 (module), 50
p32() (in module [Link]), 132
[Link] (module), 55
p64() (in module [Link]), 132
[Link] (module), 53
p8() (in module [Link]), 133
[Link] (module), 55
pack() (in module [Link]), 133
[Link] (module), 56
pad() (in module [Link]), 118
[Link] (module), 56
pairwise() (in module [Link]), 118
[Link] (module), 56
parent() (in module [Link]), 137
[Link] (module), 58
parse_ldd_output() (in module [Link]), 127
[Link] (module), 59
partition() (in module [Link]), 126
[Link] (module), 59
pause() (in module [Link]), 76
[Link] (module), 58

Index

149

pwntools Documentation, Release 2.2

[Link] (module), 59
[Link] (module), 60
[Link] (module), 65
[Link] (module), 76
[Link] (module), 76
[Link] (module), 77
[Link] (module), 107
[Link] (module), 108
[Link] (module), 112
[Link] (module), 114
[Link] (module), 124
[Link] (module), 126
[Link] (module), 129
[Link] (module), 130
[Link] (module), 136
[Link] (module), 138
[Link] (module), 139
PwnlibException, 35

remote (class in [Link]), 58


repeat() (in module [Link]), 124
repeat_func() (in module [Link]), 121
reset_local() ([Link] method), 27
resolve() ([Link] method), 45
ret() (in module [Link].amd64), 48
ret() (in module [Link]), 49
ret() (in module [Link].i386), 52
ret() (in module [Link]), 56
rol() (in module [Link]), 110
ROP (class in [Link]), 44
ror() (in module [Link]), 111
roundrobin() (in module [Link]), 121
routine() (in module [Link]), 134
run() ([Link] method), 63
run_in_new_terminal() (in module [Link]), 128
run_to_end() ([Link] method), 63

s() ([Link] method), 42


save() ([Link] method), 33
search() ([Link] method), 33
search() ([Link] method), 45
R
section() ([Link] method), 34
sections ([Link] attribute), 34
random() (in module [Link]), 77
random_combination() (in module [Link]), 119 segments ([Link] attribute), 34
random_combination_with_replacement() (in module send() ([Link] method), 74
sendafter() ([Link] method), 74
[Link]), 120
random_permutation() (in module [Link]), 120 sendline() ([Link] method), 74
sendlineafter() ([Link] method), 74
random_product() (in module [Link]), 120
sendlinethen() ([Link] method), 75
randoms() (in module [Link]), 110
sendthen() ([Link] method), 75
raw() ([Link] method), 42
set_working_directory() ([Link] method),
raw() ([Link] method), 45
63
read() (in module [Link]), 127
setb()
([Link]
method), 42
read() ([Link] method), 33
setd()
([Link]
method), 42
recv() ([Link] method), 69
setq()
([Link]
method), 42
recvall() ([Link] method), 69
setregid()
(in
module
[Link]),
48
recvline() ([Link] method), 69
setregid()
(in
module
[Link]),
54
recvline_contains() ([Link] method), 70
recvline_endswith() ([Link] method), 70 setreuid() (in module [Link]), 48
setreuid() (in module [Link]), 54
recvline_pred() ([Link] method), 70
sets() ([Link] method), 43
recvline_regex() ([Link] method), 71
recvline_startswith() ([Link] method), 71 settimeout() ([Link] method), 75
setw() ([Link] method), 43
recvlines() ([Link] method), 71
sh() (in module [Link]), 48
recvn() ([Link] method), 72
sh() (in module [Link]), 50
recvpred() ([Link] method), 72
sh() (in module [Link]), 55
recvregex() ([Link] method), 73
sh() (in module [Link]), 54
recvrepeat() ([Link] method), 73
sh() (in module [Link]), 56
recvuntil() ([Link] method), 73
sh_string() (in module [Link]), 128
regex
sha1file() (in module [Link]), 113
constgrep command line option, 13
sha1filehex() (in module [Link]), 113
register() (in module [Link]), 19
sha1sum() (in module [Link]), 113
register() (in module [Link]), 20
sha1sumhex() (in module [Link]), 113
register_sizes() (in module [Link]), 127
q() ([Link] method), 41
quantify() (in module [Link]), 119

150

Index

pwntools Documentation, Release 2.2

sha224file() (in module [Link]), 113


sha224filehex() (in module [Link]), 113
sha224sum() (in module [Link]), 113
sha224sumhex() (in module [Link]), 113
sha256file() (in module [Link]), 113
sha256filehex() (in module [Link]), 113
sha256sum() (in module [Link]), 113
sha256sumhex() (in module [Link]), 113
sha384file() (in module [Link]), 113
sha384filehex() (in module [Link]), 113
sha384sum() (in module [Link]), 113
sha384sumhex() (in module [Link]), 113
sha512file() (in module [Link]), 113
sha512filehex() (in module [Link]), 113
sha512sum() (in module [Link]), 114
sha512sumhex() (in module [Link]), 114
shell() ([Link] method), 64
shellcraft command line option
-?, show, 15
-f <<format>>, format <<format>>, 15
-h, help, 15
-o <<file>>, out <<file>>, 15
shutdown() ([Link] method), 75
shutdown_raw() ([Link] method), 75
sign ([Link] attribute), 27
signed ([Link] attribute), 27
signedness ([Link] attribute), 28
signednesses ([Link] attribute), 28
size() (in module [Link]), 128
sleep() (in module [Link]), 43
sock (class in [Link]), 59
spawn_process() ([Link] method), 75
ssh (class in [Link]), 60
ssh_channel (class in [Link]), 65
ssh_connecter (class in [Link]), 65
ssh_listener (class in [Link]), 65
stackhunter() (in module [Link].i386), 52
stager() (in module [Link]), 54
starmap() (in module [Link]), 124
start ([Link] attribute), 34
starttime() (in module [Link]), 137
stat() (in module [Link]), 137
state() (in module [Link]), 138
status() (in module [Link]), 138
success() ([Link] method), 38
syscall() (in module [Link]), 48
syscall() (in module [Link]), 54
sysv_hash() (in module [Link]), 31

T
tabulate() (in module [Link]), 121
take() (in module [Link]), 122
takewhile() (in module [Link]), 124
tee() (in module [Link]), 124
Index

term_mode (in module [Link]), 56


test_expr() (in module [Link]), 139
Thread (class in [Link]), 29
Timeout (class in [Link]), 56
timeout ([Link] attribute), 28
timeout ([Link] attribute), 58
timeout_change() ([Link] method), 58
timeout_change() ([Link] method), 75
to_thumb() (in module [Link]), 50
tracer() (in module [Link]), 138
trap() (in module [Link].amd64), 48
trap() (in module [Link].i386), 53
tube (class in [Link]), 65

U
u16() (in module [Link]), 134
u32() (in module [Link]), 134
u64() (in module [Link]), 134
u8() (in module [Link]), 135
unbits() (in module [Link]), 111
unhex command line option
-h, help, 15
hex, 15
unhex() (in module [Link]), 111
unique_everseen() (in module [Link]), 122
unique_justseen() (in module [Link]), 123
unique_window() (in module [Link]), 123
unordlist() (in module [Link]), 126
unpack() (in module [Link]), 135
unpack_many() (in module [Link]), 135
unrecv() ([Link] method), 76
unregister() (in module [Link]), 20
unregister() (in module [Link]), 20
unresolve() ([Link] method), 45
update() ([Link] method), 28
upload_data() ([Link] method), 64
upload_dir() ([Link] method), 64
upload_file() ([Link] method), 64
urldecode() (in module [Link]), 111
urlencode() (in module [Link]), 112

V
vaddr_to_offset() ([Link] method), 34

W
w() ([Link] method), 43
wait_for_close() ([Link] method), 76
wait_for_connection()
([Link]
method), 59
wait_for_debugger() (in module [Link]), 138
warn() ([Link] method), 38
warn_once() ([Link] method), 38
wget() (in module [Link]), 139
which() (in module [Link]), 129
151

pwntools Documentation, Release 2.2

which_binutils() (in module [Link]), 19


word_size ([Link] attribute), 28
writable_segments ([Link] attribute), 34
write() (in module [Link]), 129
write() ([Link] method), 34

X
x_25() (in module [Link]), 106
xfer() (in module [Link]), 106
xmodem() (in module [Link]), 106
xor() (in module [Link]), 112
xor_pair() (in module [Link]), 112

152

Index

You might also like