Saya mencoba membaca tumpukan proses anak tetapi tidak berhasil. Saya tahu itu mungkin menggunakan ptrace
, tetapi ptrace
antarmuka memungkinkan Anda untuk membaca hanya satu kata pada suatu waktu, dan saya mencoba untuk memindai bagian yang lebih besar dari tumpukan.
Saya juga mencoba membaca /proc/$pid/mem
dari batas stack yang diekstraksi dari /proc/$pid/maps
file setelah terlebih dahulu menggunakan ptrace untuk melampirkannya (seperti yang disarankan di sini ) tetapi pembacaannya tetap gagal (bahkan ketika dijalankan sebagai root) meskipun kode yang sama berhasil ketika dicoba membaca dari berbagai bagian proses (misalnya tumpukan).
Apa yang saya lakukan salah? Apakah ada opsi lain?
waitpid
antaraptrace(PTRACE_ATTACH,…)
danread
(jika tidak, ada kemungkinan kondisi balapan)? Kesalahan apa yang munculread
? Apakah anak melakukan sesuatu yang aneh dengan pemetaan memorinya - dapatkah Anda mencoba kode Anda dengan anak sederhanasleep
?Jawaban:
Nah, cukup gunakan satu lingkaran, lalu. Jujur saya tidak melihat bagaimana itu merupakan masalah dengan
ptrace
, saya menggunakannya sepanjang waktu untuk proses akses jarak jauh.Saya menggunakan sesuatu seperti ini:
sumber
Berikut ini adalah strategi lain yang mungkin perlu diubah tetapi harus lebih efisien dengan potongan data yang besar. Idenya adalah untuk menjalankan syscalls dalam proses jarak jauh untuk mengambil isi stack. Ini akan memerlukan kode arsitektur khusus tetapi jika Anda hanya menargetkan x86 / x86_64 itu tidak boleh terlalu merepotkan.
"/tmp/fifo"
dalam proses panggilan Anda.PTRACE_SYSCALL
untuk melangkah,waitpid()
untuk menunggu danPTRACE_GETREGS
/PTRACE_PEEKTEXT
untuk memeriksa opcode yang saat ini dieksekusi.open("/tmp/fifo")
,write()
isi stack,close()
deskriptor.Mungkin ada alternatif yang lebih elegan untuk pipa bernama, tapi saya tidak bisa memikirkan apa pun sekarang. Alasan saya hanya menggunakan syscalls adalah karena injeksi kode jarak jauh sangat tidak dapat diandalkan pada sistem modern karena berbagai perlindungan keamanan. Kekurangannya adalah ia akan hang sampai proses jarak jauh melakukan syscall (yang dapat menjadi masalah untuk beberapa program yang sebagian besar melakukan perhitungan).
Anda dapat melihat beberapa kode bebas menerapkan sebagian besar pekerjaan dalam file sumber ini . Umpan balik pada kode ini disambut baik!
sumber
Saran lain.
Ketika / jika diterima di pohon kernel Linux utama, Anda akan dapat menggunakan tambalan Memori Salib Christopher Yeoh . Lihat dokumentasi untuk process_vm_readv misalnya.
sumber
Anda dapat dengan mudah membaca tumpukan proses lain menggunakan sistem file proc (Anda akan memerlukan akses root untuk ini). Sebelum membaca sewenang-wenang dari / proc / pid / mem Anda perlu berkonsultasi dengan / proc / pid / maps. Bacaan sederhana dalam file ini menunjukkan banyak entri. Kami tertarik pada entri yang ditandai sebagai tumpukan. Setelah Anda mendapatkan ini, Anda perlu membaca batas bawah dan atas tumpukan. Sekarang cukup buka file / proc / pid / mem, cari batas bawah tumpukan dan baca ukuran data yang benar.
sumber
mems
dan tidakmaps
? (Saya tidak dapat melihatmems
entri di/proc
sistem file saya .) OP telah disebutkan membaca batas stack dari/proc/$pid/maps
- apa yang Anda sarankan agar mereka lakukan secara berbeda?Anda bisa mencoba lsstack . Ini menggunakan ptrace, sama seperti setiap program "baca proses tumpukan lainnya" yang sukses. Saya tidak bisa mendapatkan program menggunakan / proc / $ pid / mem membaca untuk bekerja. Saya percaya bahwa Anda tidak dapat melakukannya dengan cara itu, meskipun, secara logis, Anda harus melakukannya.
sumber