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.