Lewati ke isi
pwn-labs
Kembali ke world

Win dengan Argumen

x86-32 · 300 poin

Tujuan

Bangun stack panggilan fungsi dengan dua argumen yang benar.

Konsep

Dalam konvensi panggilan cdecl x86-32, argumen diletakkan di stack. Pada saat fungsi baru dimasuki, [ESP] berisi alamat kembali, [ESP+4] argumen pertama, dan [ESP+8] argumen kedua.

Ketika masuk melalui ret, prosesor tidak melakukan call baru. Anda perlu menyusun sendiri stack yang menyerupai hasil pemanggilan fungsi: alamat kembali pengganti disusul argumen-argumen. Urutan ini berbeda dari sekadar menambahkan argumen tepat setelah pengisi.

Panduan alat

Cari alamat win pada disassembly dan hitung offset berdasarkan buffer soal ini. Baca dua pemeriksaan di representasi C: argumen pertama harus 0x13579bdf, argumen kedua 0x2468ace0.

Jika output belum sesuai, periksa memori sesudah lokasi return address. Pastikan setiap bagian memakai empat byte. Fungsi win mengakhiri program dengan exit, sehingga slot alamat kembali pengganti tetap harus ada meskipun tidak akan dijalankan.

Tantangan

Arahkan eksekusi ke win dengan kedua argumen benar sampai program mencetak STACK_ARGUMENTS_OK. Program yang mencapai fungsi dengan argumen salah akan keluar tanpa penanda sukses.

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(unsigned int first, unsigned int second) {
  if (first != 0x13579bdf || second != 0x2468ace0) exit(1);
  write(1, "STACK_ARGUMENTS_OK\n", 19);
  exit(0);
}
void vuln(void) {
  char buffer[80]; /* 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.