Basic usage
Connect to host
from pwn import *
= remote("host", port)
r "Your exploit")
r.send(print(r.recvline())
# Interaktive Eingabe: Text von stdin wird direkt gesendet und alle Antworten vom Server angezeigt (auch bisherige) r.interactive()
Connect through SSH
from pwn import *
= ssh("user", "ssh-host", port, password = "password").remote("service-host", port) r
Run local binary
from pwn import *
= process('./binary')
r
'Your exploit') # Just like a remote connection r.send(
Run local binary in gdb
from pwn import *
= ['x-terminal-emulator', '-e'] # Setze das Terminal, dass benutzt werden soll (Mit der `run command` option)
context.terminal
= gdb.debug('./binary')
r
'Your exploit') # Just like a remote connection r.send(
Binaries
Loading an ELF
from pwn import *
bin = ELF('./binary')
print(bin.symbols['foobar']) # Addresse des Symbols `foobar` im binary
print(bin.got['system']) # Addresse des got-Eintrags für `system`
Crafting assembly
from pwn import *
= 'amd64' # Instruction-set setzen
context.arch
= asm('mov rax, 10')
code = asm(shellcraft.sh()) # Hiermit kann man den standard shellcode kompilieren shellcode
PWNTools ROP
PWNTools stellt ein Objekt zur Verfügung, das die benötigte Payload automatisch generieren kann. doc
Hierbei können Funktionen mit Aufrufparametern übergeben werden und PWNTools sucht automatisch die nötigen Gadgets heraus.
Funktionen aufrufen
In diesem Beispiel möchten wir die Funktion do_stuff(1, 2, 3)
aufrufen:
= ROP(ELF("./binary"))
rop
1, 2, 3) # Aquivalent zu rop.call("do_stuff", (1, 2, 3))
rop.do_stuff(
bytes(rop)) # Send the exploit r.send(
Ist an der zu springenden Adresse kein Symbol (z.B. weil das Binary gestripped ist), kann man die Adresse auch an die call
-Funktion übergeben:
= ROP(ELF("./binary"))
rop
0x40000, (1, 2, 3)) # do_stuff ist bei Adresse 0x40000
rop.call(
str(rop)) # Send the exploit r.send(