0Pricing
Cyber Security Academy · Pelajaran

Kerentanan String Format

Eksploitasi string format printf untuk membaca memori arbitrer dan menulis ke alamat arbitrer.

Kerentanan String Format adalah pelajaran Cyber Security Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Cyber Security Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Cyber Security Academy mencakup 4 pelajaran total.

Apa Itu Kerentanan String Format

Kerentanan string format terjadi ketika input pengguna diteruskan secara langsung sebagai argumen string format ke printf() atau fungsi serupa. Penyerang dapat membaca memori, membocorkan alamat tumpukan, dan menulis nilai sembarang.

Pola yang Rentan

Rentan vs aman:

// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);

// SAFE - user input is a data argument:
printf("%s", user_input);

Membaca Memori dengan %x dan %p

Penentu format tanpa argumen yang sesuai membaca nilai dari tumpukan:

# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!

Mengatasi ASLR dengan Kebocoran String Format

Tumpukan sering berisi penunjuk ke libc, tumpukan, dan biner. Dengan membocorkannya menggunakan penentu %p atau %lx, penyerang dapat menghitung alamat dasar dan mengatasi ASLR — bahkan tanpa kerentanan lainnya.

Membaca Memori Sembarang dengan %s

%s memperlakukan nilai tumpukan sebagai penunjuk dan mencetak string pada alamat tersebut. Dengan menempatkan alamat target pada posisi tumpukan yang tepat dan menggunakan akses parameter (%7$s), penyerang dapat membaca lokasi memori sembarang.

# Direct parameter access:
printf("%7$s")  # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory

Menulis Memori dengan %n

%n menulis jumlah karakter yang telah dicetak sejauh ini ke alamat yang ditunjuk oleh argumen terkait. Hal ini memungkinkan penulisan nilai yang dikendalikan ke alamat sembarang — yang berpotensi menimpa penunjuk fungsi atau alamat pengembalian.

Teknik Penulisan Praktis

Untuk menulis nilai tertentu menggunakan %n:

  1. Kendalikan penunjuk pada tumpukan yang menunjuk ke alamat target
  2. Gunakan %Xc%N$n untuk menulis X karakter, lalu tulis jumlah tersebut ke parameter ke-N (alamat target)

Alat seperti pwntools mengotomatiskan pembuatan eksploitasi string format.

Menemukan Kesalahan String Format

Menguji kerentanan string format:

# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)

# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vuln

Pertahanan: Perbaiki Kodenya

Perbaikannya sangat sederhana: selalu teruskan input pengguna sebagai argumen data, bukan sebagai string format.

// WRONG:
printf(buffer);

// RIGHT:
printf("%s", buffer);

// Compiler warning:
// gcc -Wformat-security will flag this

String Format dalam Bahasa Lain

Kerentanan string format terjadi dalam banyak bahasa:

  • C: printf(input)
  • Python: tidak sama — tetapi pemformatan % dengan input berupa kamus dapat mengekspos variabel
  • Java: String.format(input) — lebih tidak berbahaya dan tidak memiliki akses memori

Contoh di Dunia Nyata

Kesalahan string format pernah berdampak pada:

  • ProFTPD — memungkinkan eksekusi kode jarak jauh melalui perintah FTP
  • WU-FTPD — eksploitasi root jarak jauh melalui string format
  • Berbagai layanan latar Linux sebelum tahun 2000-an

Kompilator modern dan FORTIFY_SOURCE membantu, tetapi tidak sepenuhnya menghilangkan kelas kerentanan ini.

Pemeriksaan Singkat: String Format

Penentu format mana yang dapat digunakan untuk menulis ke alamat memori sembarang dalam serangan string format?

Rangkuman Pelajaran

Kerentanan string format terjadi ketika input pengguna digunakan secara langsung sebagai string format printf. %p/%x membocorkan memori tumpukan; %s membaca alamat sembarang; %n menulis ke alamat sembarang. Perbaikannya hanya memerlukan satu karakter: printf("%s", input). Aktifkan -Wformat-security dalam opsi kompilator untuk mendeteksi masalah ini.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kerentanan String Format” gratis?

Ya — teks lengkap “Kerentanan String Format” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Cyber Security Academy, upgrade ke CoddyKit PRO. Kursus Cyber Security Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kerentanan String Format”?

Eksploitasi string format printf untuk membaca memori arbitrer dan menulis ke alamat arbitrer. Kamu berlatih Cyber Security Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Cyber Security Academy?

Tidak diperlukan pengalaman sebelumnya. Cyber Security Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Kerentanan String Format” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Cyber Security Academy ini?

Ya. Setiap pelajaran Cyber Security Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Luapan Buffer Tumpukan
  2. Pemrograman Berorientasi Pengembalian (ROP)
  3. Kerentanan String Format
  4. Eksploitasi Heap: Use-After-Free dan Penyemprotan Heap
← Kembali ke Cyber Security Academy