Lewati ke isi
pwn-labs
Kembali ke world

Kunci Empat Byte

x86-32 · 150 poin

Tujuan

Susun nilai 32-bit yang tepat untuk membuka kunci program.

Konsep

Integer 32-bit menempati empat byte. Pada x86, urutannya little-endian: byte dengan nilai paling rendah berada pada alamat paling rendah. Sebagai contoh terpisah, angka 0x11223344 disimpan sebagai 44 33 22 11.

Pembantu p32(angka) mengubah angka menjadi empat byte little-endian. Menulis teks angka heksadesimal menghasilkan karakter ASCII, bukan representasi integer tersebut. Kunci soal ini adalah 0x6b657931; program memeriksa seluruh empat byte.

Panduan alat

Temukan buffer dan kunci pada representasi C. Jalankan masukan pendek terlebih dahulu. Gunakan pratinjau Lihat byte heksadesimal untuk memeriksa byte hasil ekspresi sebelum menjalankannya.

Sesudah uji, bandingkan empat byte setelah buffer pada panel Memori stack dengan nilai yang diminta. Alamat dan isi byte adalah dua hal berbeda: Anda sedang mengubah sebuah nilai, bukan menulis alamat fungsi.

Tantangan

Ubah kunci awal yang bernilai nol menjadi tepat 0x6b657931. Program harus mencetak STACK_MAGIC_OK. Masukan dibatasi sampai akhir kunci; ret2win tidak diperlukan.

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[36];
    unsigned int key;
  } frame;
  frame.key = 0;
  read(0, frame.buffer, 40); /* sengaja melewati buffer */
  if (frame.key == 0x6b657931) {
    write(1, "STACK_MAGIC_OK\n", 15);
    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.