Langkau ke kandungan
Semua kupasan
KUPASAN PASUKANPwn

No Hack No CTF 2026

Web3JS

Daripada bacaan tindanan VM di luar sempadan kepada objek palsu dan pengalihan semula panggilan balik natif.

Diterbitkan
Kategori
Pwn / Eksploitasi Binari

Web3JS menyediakan shell JavaScript tersuai dengan antara muka evm(). Operasi timbunannya mempercayai indeks yang dikawal penyerang, maka nilai JavaScript boleh dibaca melepasi penghujung logik timbunan VM.

Kebocoran pertama memang berguna, tetapi penyelesaian sebenar bergantung pada cara menukarkannya kepada primitif objek yang stabil dalam ruang alamat termampat V8.

Bina addrof

Menolak sebuah objek ke dalam timbunan tersuai dan membaca slot mentah bersebelahan mendedahkan representasi bertag (tagged). Selepas mengambil kira tag tersebut, ini menjadi primitif pemerolehan alamat yang boleh diulang:

function addrof(object) {
  vm.push(object)
  return untag(vm.get(outOfBoundsIndex))
}

Mengekalkan objek pembawa agar terus hidup menghalang kutipan sampah (garbage collection) daripada mengubah susun atur ketika eksploit dibina.

Tukar tag palsu menjadi fakeobj

Arah sebaliknya menggunakan slot di luar batas yang diisi dengan penuding bertag pilihan. Membaca slot itu melalui VM membuatkan enjin mentafsir nilainya sebagai objek JavaScript.

Dengan addrof dan fakeobj, kami meletakkan pengepala tatasusunan nombor titik terapung padat yang palsu pada ofset terkawal di dalam ruang simpanan dalaman (backing store) sebenar. Menghalakan semula medan elemennya memberikan akses baca dan tulis kepada alamat dalam ruang termampat.

Halakan semula panggilan balik natif

Shell itu mendedahkan fungsi pembantu natif. Menelusuri graf objek bagi salah satu fungsi pembantu membawa kami daripada JSFunction kepada metadata templat dan penuding panggilan balik yang berkaitan.

Daripada meneka alamat mutlak, eksploit membandingkan fungsi pembantu daripada keluarga yang sama dalam binari tersebut dan menggunakan semula susun atur relatif metadata mereka. Ia menukar sementara satu pembantu yang tidak berbahaya supaya laluan penghantarannya sampai kepada pengendali arahan tersembunyi.

Selepas pembantu yang dihalakan semula dipanggil, eksploit memulihkan perkataan mesin asal. Ini mengelakkan proses daripada ranap ketika ditamatkan dan memudahkan primitif itu disahkan secara setempat.

Inti penyelesaian

Ralat batas yang kecil dalam jambatan VM tersuai boleh merentasi beberapa lapisan kepercayaan serentak: nilai JavaScript menjadi perkataan mesin bertag yang mentah, perkataan itu menjadi objek palsu, dan objek palsu akhirnya mencapai metadata panggilan balik natif.

Halaman acara: No Hack No CTF 2026 di CTFtime.