Lewati ke isi
pwn-labs
Kembali ke world

Ubah Status

x86-32 · 100 poin

Tujuan

Lewati batas buffer dan ubah status yang tersimpan tepat di sebelahnya.

Konsep

Sebuah buffer memiliki kapasitas tetap, tetapi operasi read menerima jumlah byte yang diminta program. Jika jumlah itu terlalu besar, byte berikutnya menimpa data di alamat yang lebih tinggi. Ini disebut buffer overflow.

Pada program ini, buffer dan status ditempatkan berurutan seperti sebuah struct C. Status awalnya nol. Program hanya membuka akses ketika status berubah menjadi bukan nol. Anda belum perlu mengubah alur eksekusi atau mencari alamat fungsi.

Panduan alat

Baca ukuran buffer dan batas read pada tab Kode sumber. Coba masukan pendek, lalu periksa Memori stack setelah menjalankan payload. Setiap baris menampilkan empat byte pada alamat yang tertera; 41 adalah byte ASCII untuk huruf A.

Ekspresi "B" * 8 menghasilkan delapan byte B. Ubah panjang masukan sedikit demi sedikit dan bandingkan isi memori. Masukan tidak diakhiri byte nol secara otomatis.

Tantangan

Buat status berubah dari nol menjadi bukan nol. Program harus mencetak STACK_STATUS_OK. Pembacaan dibatasi sampai akhir variabel status; return address tidak dapat ditimpa pada soal ini.

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 vuln(void) {
  struct {
    char buffer[24];
    unsigned int status;
  } frame;
  frame.status = 0;
  read(0, frame.buffer, 28); /* sengaja melewati buffer */
  if (frame.status != 0) {
    write(1, "STACK_STATUS_OK\n", 16);
    exit(0);
  }
  exit(1);
}
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.