Lewati ke isi
pwn-labs
Kembali ke world

Kuasai Alamat Kembali

x86-32 · 200 poin

Tujuan

Temukan jarak dari buffer ke alamat kembali dan kendalikan tujuan ret.

Konsep

Instruksi call menyimpan return address, yaitu alamat instruksi berikutnya pada pemanggil. Fungsi vuln kemudian menyimpan EBP dan menyediakan buffer di stack. Saat fungsi selesai, leave memulihkan frame dan ret mengambil alamat kembali dari stack.

Overflow kini dapat mencapai return address. Offset adalah jumlah byte dari awal buffer ke bagian yang ingin ditimpa. Empat byte saved EBP juga perlu dilewati; ukuran buffer saja belum tentu sama dengan offset.

Panduan alat

Alamat target ditampilkan di bawah materi ini. Tugas Anda adalah menemukan jaraknya dari awal buffer. Anda boleh menghitung dari source atau menggunakan pola cyclic(80).

Jalankan pola tersebut dan buka Register CPU. Crash setelah ret biasanya membuat EIP berisi empat byte pola. Masukkan cyclic_find(angka) sebagai ekspresi payload untuk melihat offset dalam pratinjau byte heksadesimal. Pembantu di situs ini menghasilkan empat byte offset dalam little-endian; misalnya 10 00 00 00 berarti offset 16. Cocokkan dengan panel stack yang menandai saved EBP dan alamat kembali.

Tantangan

Ganti return address dengan alamat fungsi target yang disediakan, sampai program mencetak STACK_OFFSET_OK. Crash saat mencari offset adalah bagian dari latihan; crash saja belum berarti berhasil.

Pilih Uji payload untuk menjalankan masukan di browser. Setelah berhasil, Kirim jawaban meminta verifikasi server dan menyimpan progress. Masuk dengan GitHub diperlukan untuk mengirim jawaban.

Petunjuk dapat dibuka satu per satu. Untuk akun yang masuk, setiap petunjuk mengurangi poin sesuai aturan yang ditampilkan di panduan.

Source latihan

Tab Kode sumber menampilkan representasi konsep C. Binary dibuat dari assembly GNU; layout stack mengikuti assembly tersebut, bukan hasil kompilasi C. Anda juga dapat mengunduh binary latihan.

Alamat fungsi target: 0x804802d.

Representasi konsep C. Cari batas masukan dan kondisi sukses; layout sebenarnya mengikuti assembly latihan.

/* Representasi konsep C, bukan source hasil kompilasi.
 * Binary sebenarnya dibangun dari challenge.S (GNU x86-32).
 * Layout frame ditetapkan assembly; compiler C bebas memilih layout berbeda.
 * read/write/exit disediakan emulator melalui int 0x80.
 */
void target(void) {
  write(1, "STACK_OFFSET_OK\n", 16);
  exit(0);
}
void vuln(void) {
  char buffer[40]; /* tepat di bawah saved EBP pada assembly ini */
  read(0, buffer, 256); /* overflow sampai alamat kembali */
}
void _start(void) {
  vuln();
  exit(1);
}

Data masukan yang akan diterima program. Susun masukan sesuai petunjuk tantangan.

8 byte siap diuji.

Lihat byte heksadesimal

41 41 41 41 41 41 41 41

Emulator sedang dimuat…

Kirim jawaban tersedia setelah payload ini berhasil diuji. Masuk dengan GitHub saat mengirim. Payload disimpan di tab ini; uji ulang setelah kembali.

Uji payload menjalankan masukan di browser. Kirim jawaban meminta pemeriksaan server dan menyimpan poin jika berhasil.