Establishing Connection
Pwntools establishes a standard interface for connecting to locally and remotely binaries. This is accomplished via the pwnlib.tubes
module.
Connecting to a Remote Process
Use remote()
for easy connection to remote processes.
p = remote('ctf.ironforgecyber.com', 1100)
You can also use a listener to connect to a remote process.
l = listen(1100) r = remote('ctf.ironforgecyber.com', l.lport) p = l.wait_for_connection()
Connecting to a Local Process
Use process()
for easy connection to local processes.
p = process('./win32')
Using GDB with Pwntools
We can use gdb.debug()
to run a local process within gdb
. This takes a secondary argument, gdbscript
, which is a string of commands to run in gdb
. This is useful for setting breakpoints, etc.
p = gdb.debug('./win32', gdbscript='b *main\nc')
People commonly use a separate variable for their gdbscript
because it's easier to read. Using a separate string allows you to use triple quotes, making writing multi-line scripts easier.
cmds = ''' b *main c ''' p = gdb.debug('./win32', gdbscript=cmds)
We can use gdb.attach()
to attach to a process. It takes the target to attach to (which, under the hood, is the process ID).
p = process('./win32') gdb.attach(p)