Pendahuluan
Dalam dunia cybersecurity, kita sering mendengar istilah Binary Exploitation atau yang biasa disingkat BinExp. Bidang ini mempelajari bagaimana sebuah program yang sudah dikompilasi dapat dianalisis dan bagaimana kelemahan pada program tersebut dapat dimanfaatkan dalam lingkungan pengujian yang diizinkan.
Binary Exploitation banyak ditemukan dalam kompetisi Capture The Flag (CTF), khususnya pada kategori Pwn atau Binary Exploitation.
Masalahnya, proses membuat exploit biasanya membutuhkan banyak pekerjaan manual. Kita harus menjalankan program, mengirim input, membaca output, memeriksa register, menghitung offset, mencari alamat memory, sampai membuat payload.
Di sinilah Pwntools menjadi sangat berguna.
Pwntools adalah toolkit berbasis Python yang menyediakan berbagai fungsi untuk membantu security researcher dan peserta CTF membuat script untuk berinteraksi dengan binary dan service jaringan.
Sederhananya:
Binary
↓
Analisis
↓
Temukan Vulnerability
↓
Buat Payload
↓
Pwntools
↓
Automation
Apa Itu Pwntools?
Pwntools adalah library Python yang dibuat untuk membantu proses Binary Exploitation, CTF, dan security research.
Dengan Pwntools, kita dapat membuat script Python yang mampu:
- menjalankan program lokal;
- berkomunikasi dengan program;
- mengirim input;
- menerima output;
- membuat payload;
- mencari offset;
- membaca informasi dari binary ELF;
- melakukan packing data;
- membantu membuat ROP chain;
- berkomunikasi dengan service melalui network.
Contoh paling sederhana:
from pwn import *
p = process("./program")
p.interactive()
Kode tersebut menjalankan binary bernama program menggunakan Pwntools.
Jadi daripada menjalankan program secara manual, kita dapat mengontrolnya menggunakan script Python.
Mengapa Pwntools Banyak Digunakan dalam CTF?
Dalam challenge CTF, kita sering melakukan pekerjaan yang sama berulang kali.
Misalnya:
Jalankan program
↓
Kirim input
↓
Baca output
↓
Program crash
↓
Ubah payload
↓
Jalankan lagi
↓
Kirim payload
Jika dilakukan secara manual, proses tersebut cukup merepotkan.
Dengan Pwntools, kita dapat mengubah proses tersebut menjadi script:
Python
↓
Pwntools
↓
Binary
↓
Input
↓
Output
Kita cukup menjalankan script setiap kali ingin menguji payload.
Inilah alasan Pwntools sangat populer di kalangan peserta CTF.
Instalasi Pwntools
Pwntools dapat diinstal menggunakan pip.
Contohnya:
python3 -m pip install pwntools
Setelah selesai, kita dapat menguji instalasi:
python3 -c "from pwn import *; print('Pwntools OK')"
Jika muncul:
Pwntools OK
berarti library berhasil digunakan oleh Python.
Untuk lingkungan belajar, penggunaan Python virtual environment juga disarankan agar dependency tidak bercampur dengan project Python lainnya.
Program Pwntools Pertama
Misalnya kita memiliki program:
./target
Kita dapat menjalankannya menggunakan:
from pwn import *
p = process("./target")
p.interactive()
Ada dua bagian penting.
Pertama:
p = process("./target")
process() digunakan untuk menjalankan program lokal.
Kedua:
p.interactive()
Fungsi tersebut membuat kita dapat berinteraksi langsung dengan program yang sedang berjalan.
Konsepnya:
Python Script
↓
Pwntools
↓
./target
↓
Input / Output
Menggunakan process()
process() merupakan salah satu fungsi yang paling sering digunakan dalam latihan Binary Exploitation.
Contohnya:
from pwn import *
p = process("./target")
Setelah program berjalan, kita dapat mengirim data:
p.sendline(b"Hello")
Kemudian membaca output:
print(p.recvline())
Contoh lengkap:
from pwn import *
p = process("./target")
p.sendline(b"Hello")
print(p.recvline())
p.close()
Dengan cara ini, Python dapat bertindak sebagai client yang berkomunikasi dengan program.
Menggunakan remote()
Dalam CTF, binary tidak selalu dijalankan di komputer kita.
Kadang challenge menyediakan service seperti:
challenge.example.com:1337
Untuk kondisi seperti ini, Pwntools menyediakan:
remote()
Contohnya:
from pwn import *
p = remote("challenge.example.com", 1337)
p.interactive()
Konsepnya:
Exploit Script
↓
Pwntools
↓
Network
↓
CTF Server
Perbedaan sederhananya:
process("./target")
digunakan untuk binary lokal.
Sedangkan:
remote("host", port)
digunakan untuk service melalui jaringan yang memang disediakan untuk pengujian.
Mengirim dan Menerima Data
Beberapa fungsi penting Pwntools adalah:
send()
sendline()
recv()
recvline()
recvuntil()
Misalnya program menampilkan:
Name:
Kita dapat menunggu sampai prompt tersebut muncul:
p.recvuntil(b"Name: ")
Kemudian mengirim nama:
p.sendline(b"John")
Contoh:
from pwn import *
p = process("./target")
p.recvuntil(b"Name: ")
p.sendline(b"John")
p.interactive()
recvuntil() sangat berguna ketika program memiliki beberapa tahap input.
Mengapa Banyak Menggunakan b"..."?
Jika Anda baru menggunakan Pwntools, mungkin akan sering melihat:
b"Hello"
dan bukan:
"Hello"
Dalam Python, "Hello" merupakan string, sedangkan:
b"Hello"
merupakan data bertipe bytes.
Binary exploitation bekerja sangat dekat dengan representasi byte di memory. Karena itu Pwntools banyak menggunakan bytes.
Contohnya:
p.sendline(b"Hello")
Kita juga dapat membuat payload:
payload = b"A" * 32
Hasilnya adalah 32 karakter A.
Membuat Payload
Dalam Binary Exploitation, kita sering perlu membuat input dengan format tertentu.
Misalnya:
payload = b"A" * 32
Artinya kita membuat 32 byte:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Payload tersebut kemudian dapat dikirim:
p.sendline(payload)
Dalam challenge buffer overflow, payload dapat terdiri dari beberapa bagian:
Padding
↓
Data tambahan
↓
Address
↓
ROP Chain
Pwntools membantu membuat setiap bagian tersebut secara lebih mudah.
Menggunakan cyclic() untuk Mencari Offset
Salah satu fitur yang sangat berguna adalah:
cyclic()
Misalnya:
pattern = cyclic(200)
Pwntools akan menghasilkan pola byte yang memiliki urutan unik.
Pola tersebut dapat digunakan dalam latihan buffer overflow untuk membantu mengetahui posisi suatu nilai yang muncul ketika program mengalami crash.
Alur sederhananya:
cyclic()
↓
Pattern
↓
Program Crash
↓
Periksa Register
↓
Cari Posisi Pattern
↓
Offset
Kemudian kita dapat menggunakan:
cyclic_find()
untuk mencari posisi pattern tertentu.
Konsep offset sangat penting dalam Binary Exploitation karena kita perlu mengetahui seberapa jauh data input berada dari data kontrol seperti return address.
p32() dan p64()
Dalam exploitation, kita sering bekerja dengan alamat seperti:
0x401234
Alamat tersebut perlu dikonversi menjadi representasi byte sebelum dimasukkan ke payload.
Pwntools menyediakan:
p32()
untuk nilai 32-bit dan:
p64()
untuk nilai 64-bit.
Contohnya:
address = p64(0x401234)
Kemudian address tersebut dapat digunakan sebagai bagian payload.
Hal ini disebut packing.
Sebaliknya, Pwntools juga memiliki fungsi untuk melakukan unpacking ketika kita mendapatkan data bytes dan ingin mengubahnya menjadi angka.
Bekerja dengan ELF
Binary Linux umumnya menggunakan format ELF (Executable and Linkable Format).
Pwntools memiliki class:
ELF()
yang dapat digunakan untuk membaca informasi dari binary.
Contohnya:

from pwn import *
elf = ELF("./target")
Kita kemudian dapat mengakses symbol tertentu:
print(hex(elf.symbols["main"]))
Misalnya binary memiliki function:
void win()
{
...
}
Kita dapat mencoba mendapatkan alamat symbol tersebut:
elf.symbols["win"]
Ini sangat berguna dalam challenge seperti ret2win, ketika kita perlu mengetahui alamat function tertentu.
Mengapa ELF Sangat Penting?
Tanpa tool seperti Pwntools, kita mungkin harus mencari informasi binary menggunakan berbagai tool:
readelf
objdump
nm
strings
Pwntools membantu mengakses sebagian informasi tersebut langsung melalui Python.
Konsepnya:
Binary ELF
↓
ELF()
↓
Symbol
↓
Address
↓
Payload
Tentu saja, Pwntools bukan pengganti readelf, objdump, GDB, atau Ghidra. Tool-tool tersebut memiliki fungsi analisis yang berbeda dan biasanya digunakan bersama.
Mengenal ROP dengan Pwntools
Setelah memahami buffer overflow, salah satu materi lanjutan adalah Return-Oriented Programming (ROP).
ROP menggunakan potongan instruksi yang sudah tersedia di binary atau library untuk membentuk rangkaian eksekusi tertentu.
Pwntools menyediakan class:
ROP()
Contohnya:
from pwn import *
elf = ELF("./target")
rop = ROP(elf)
Kita dapat mencari gadget tertentu:
rop.find_gadget(["pop rdi", "ret"])
Gadget tersebut kemudian dapat digunakan dalam penyusunan ROP chain.
Konsep sederhananya:
Buffer Overflow
↓
Control RIP
↓
ROP Gadget
↓
Function
↓
Gadget berikutnya
↓
Control Flow
ROP merupakan materi yang lebih lanjut sehingga sebaiknya dipelajari setelah memahami stack, register, calling convention, dan buffer overflow.
Studi Kasus: Ret2win
Salah satu latihan Binary Exploitation yang bagus untuk pemula adalah ret2win.
Misalnya kita memiliki program latihan yang mempunyai:
void win()
{
puts("You win!");
}
dan function lain yang memiliki vulnerability.
Secara konseptual, tujuan latihan adalah memahami bagaimana input yang terlalu panjang dapat memengaruhi alur eksekusi dan mengarahkan program ke function win().
Workflow-nya:
1. Jalankan binary
↓
2. Analisis dengan GDB
↓
3. Temukan vulnerability
↓
4. Cari offset
↓
5. Cari alamat win()
↓
6. Buat payload
↓
7. Kirim menggunakan Pwntools
↓
8. Amati hasil
Contoh struktur script:
from pwn import *
elf = ELF("./target")
p = process(elf.path)
offset = 40
target = elf.symbols["win"]
payload = b"A" * offset
payload += p64(target)
p.sendline(payload)
p.interactive()
Angka 40 pada contoh tersebut hanyalah contoh offset. Dalam latihan nyata, offset harus diperoleh melalui analisis binary dan debugging, bukan diasumsikan.
Pwntools dan GDB
Pwntools juga dapat digunakan bersama GDB.
Misalnya:
gdb.attach(p)
Hal ini memungkinkan kita menjalankan program menggunakan Pwntools kemudian melakukan debugging dengan GDB.
Workflow-nya menjadi:
Pwntools
↓
Menjalankan Binary
↓
GDB
↓
Register
↓
Stack
↓
Memory
↓
RIP
Ini sangat membantu ketika mempelajari hubungan antara payload yang kita kirim dan perubahan pada memory.
Misalnya kita dapat memeriksa register dengan:
info registers
dan melihat stack dengan:
x/20gx $rsp
Pwntools untuk Binary 32-bit dan 64-bit
Kita juga harus mengetahui architecture binary.
Binary dapat berupa:
32-bit
atau:
64-bit
Kita dapat memeriksa menggunakan:
file ./target
Untuk binary 64-bit, kita sering menggunakan:
p64()
sedangkan binary 32-bit menggunakan:
p32()
Pwntools juga memungkinkan kita menentukan architecture:
context.arch = "amd64"
Contoh:
from pwn import *
context.arch = "amd64"
Memahami architecture penting karena ukuran register, alamat, calling convention, dan cara membuat payload dapat berbeda.
Fitur Penting Pwntools
Berikut beberapa fungsi yang sebaiknya dipahami oleh pemula:
| Fungsi | Kegunaan |
|---|---|
process() |
Menjalankan binary lokal |
remote() |
Terhubung ke service melalui network |
send() |
Mengirim data |
sendline() |
Mengirim data dengan newline |
recv() |
Membaca data |
recvline() |
Membaca satu baris |
recvuntil() |
Membaca sampai string tertentu |
cyclic() |
Membuat pattern |
cyclic_find() |
Mencari offset |
p32() |
Packing nilai 32-bit |
p64() |
Packing nilai 64-bit |
ELF() |
Membaca informasi ELF |
ROP() |
Membantu membuat ROP chain |
gdb.attach() |
Menghubungkan proses dengan GDB |
Tidak perlu menghafalkan semuanya sekaligus. Mulailah dari:
process()
sendline()
recvline()
recvuntil()
cyclic()
cyclic_find()
p64()
ELF()
Setelah itu baru lanjut ke:
ROP()
Kesalahan yang Sering Dilakukan Pemula
Ada beberapa kesalahan umum ketika mulai menggunakan Pwntools.
1. Bingung antara string dan bytes
Misalnya:
"Hello"
dan:
b"Hello"
Untuk komunikasi dengan binary, bytes biasanya yang digunakan.
2. Menganggap offset selalu sama dengan ukuran buffer
Jika buffer berukuran:
32 byte
bukan berarti offset ke return address pasti:
32
Masih terdapat kemungkinan adanya:
- saved RBP;
- alignment;
- compiler behavior;
- struktur stack frame.
Karena itu offset perlu dianalisis menggunakan debugger dan pattern.
3. Salah architecture
Binary 64-bit tetapi menggunakan:
p32()
dapat menghasilkan payload yang tidak sesuai.
4. Mengabaikan mitigasi keamanan
Modern binary dapat memiliki:
NX
ASLR
PIE
Stack Canary
RELRO
Mitigasi tersebut dapat memengaruhi teknik exploitation yang dapat digunakan.
Pwntools Bukan Pengganti GDB atau Ghidra
Pemula terkadang menganggap Pwntools dapat melakukan semuanya.
Sebenarnya setiap tool memiliki fungsi berbeda.
Contohnya:
Ghidra
↓
Reverse Engineering
GDB
↓
Dynamic Debugging
readelf / objdump
↓
Binary Analysis
Pwntools
↓
Exploit Automation
Dalam praktik CTF, tool-tool tersebut sering digunakan bersama.
Contoh workflow:
Ghidra
↓
Memahami program
GDB
↓
Memahami runtime
readelf / objdump
↓
Memeriksa binary
Pwntools
↓
Mengotomatisasi exploit
Kelebihan Pwntools
Beberapa kelebihan Pwntools adalah:
Mudah digunakan
Karena berbasis Python, kita dapat membuat automation tanpa harus menulis program yang sangat panjang.
Banyak fungsi khusus security
Pwntools menyediakan banyak fungsi yang memang dirancang untuk kebutuhan CTF dan Binary Exploitation.
Mendukung local dan remote
Kita dapat menggunakan:
process()
untuk binary lokal dan:
remote()
untuk service network yang diizinkan.
Mendukung ROP dan ELF
Fitur tersebut sangat membantu ketika masuk ke exploitation tingkat lanjut.
Kekurangan Pwntools
Walaupun powerful, Pwntools bukan alat ajaib.
Kita tetap perlu memahami:
- C;
- Linux;
- assembly;
- register;
- stack;
- heap;
- memory;
- ELF;
- GDB;
- calling convention.
Pwntools tidak otomatis menemukan semua vulnerability.
Misalnya jika terdapat buffer overflow, kita tetap harus mengetahui:
Di mana vulnerability?
↓
Berapa offset?
↓
Apa yang dapat dikontrol?
↓
Alamat apa yang dibutuhkan?
↓
Payload seperti apa?
Pwntools kemudian membantu kita mengotomatisasi proses tersebut.
Apakah Pwntools Hanya untuk Hacker?
Tidak.
Pwntools dapat digunakan untuk berbagai kegiatan yang sah, seperti:
- kompetisi CTF;
- security research;
- vulnerability research;
- exploit development dalam lingkungan lab;
- pengujian software;
- pembelajaran computer architecture;
- automation dalam penetration testing dengan izin.
Untuk belajar, sebaiknya gunakan binary yang memang dibuat untuk latihan, seperti challenge CTF atau program vulnerable yang kita buat sendiri.
Roadmap Belajar Pwntools
Jika Anda ingin mempelajari Pwntools dari dasar sampai tingkat lanjut, roadmap berikut cukup baik:
Python Dasar
↓
Linux Command Line
↓
Bahasa C
↓
x86-64 Assembly
↓
Register & Memory
↓
GDB
↓
ELF
↓
Buffer Overflow
↓
Pwntools Dasar
↓
cyclic()
↓
ELF()
↓
p64()
↓
ret2win
↓
ret2libc
↓
ROP
↓
Format String
↓
Heap Exploitation
Jangan langsung melompat ke heap exploitation.
Untuk pemula, jauh lebih baik menguasai satu konsep secara mendalam:
C
↓
Assembly
↓
Stack
↓
Buffer Overflow
↓
RIP
↓
Offset
↓
Pwntools
↓
ret2win
↓
ROP
Kesimpulan
Pwntools merupakan salah satu toolkit yang sangat berguna untuk belajar Binary Exploitation dan CTF.
Dengan Python dan Pwntools, kita dapat membuat script untuk menjalankan binary, mengirim input, membaca output, membuat payload, mencari offset, membaca informasi ELF, sampai membantu membuat ROP chain.
Namun, hal yang paling penting adalah memahami bahwa Pwntools bukan pengganti pengetahuan tentang Binary Exploitation.
Pwntools lebih tepat dianggap sebagai alat untuk menerapkan pengetahuan tersebut secara otomatis.
Jika kita memahami:
C
+
Assembly
+
Memory
+
Stack
+
Register
+
GDB
+
ELF
maka penggunaan Pwntools akan menjadi jauh lebih mudah.
Pada akhirnya, workflow yang ingin dicapai adalah:
Analisis Binary
↓
Temukan Vulnerability
↓
Pahami Memory
↓
Tentukan Offset
↓
Buat Payload
↓
Pwntools
↓
Automation
↓
Testing
Jadi, belajar Pwntools sebaiknya tidak dimulai dari menghafalkan fungsi-fungsinya, tetapi dari memahami bagaimana binary bekerja. Setelah itu, Pwntools menjadi alat yang sangat powerful untuk mengotomatisasi proses Binary Exploitation.









