Lewati ke isi
pwn-labs
Kembali ke world

Temukan Jalan ke Win

x86-32 · 250 poin

Tujuan

Temukan fungsi tersembunyi di disassembly dan arahkan eksekusi ke sana.

Konsep

Ret2win adalah teknik mengarahkan ret ke fungsi yang sudah ada di program. Anda tidak perlu memasukkan kode mesin baru. Syaratnya adalah mengontrol return address dan mengetahui alamat fungsi tujuan.

Pada soal sebelumnya alamat tujuan diberikan. Kini Anda mencari sendiri alamat win dari disassembly. Semua alamat pada latihan ini tetap agar analisis bisa diulang. Offset soal sebelumnya tidak berlaku begitu saja karena ukuran buffer berubah.

Panduan alat

Baca source untuk mengenali fungsi dan ukuran buffer. Buka Instruksi mesin: kolom kiri berisi alamat, sedangkan kolom kanan berisi instruksi x86. Cari anotasi fungsi win, lalu catat alamat instruksi pertama fungsi tersebut.

Susun pengisi dan alamat dengan operator +. Gunakan register EIP serta memori stack untuk membedakan kesalahan offset dari kesalahan alamat. Binary asli dan source assembly juga tersedia di bawah materi.

Tantangan

Temukan alamat win dan buat program mencetak STACK_RET2WIN_OK. Jalur normal tidak memanggil fungsi itu. Materi ini tidak menyediakan alamat atau payload lengkap.

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.

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 win(void) {
  write(1, "STACK_RET2WIN_OK\n", 17);
  exit(0);
}
void vuln(void) {
  char buffer[56]; /* 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.