Saya berada di luar target gdb yang dapat dieksekusi dan saya bahkan tidak memiliki tumpukan yang sesuai dengan target itu. Saya ingin melakukan satu langkah, sehingga saya dapat memverifikasi apa yang terjadi dalam kode assembly saya, karena saya bukan ahli dalam perakitan x86. Sayangnya, gdb menolak melakukan proses debug tingkat rakitan sederhana ini. Ini memungkinkan saya untuk menyetel dan berhenti pada breakpoint yang sesuai, tetapi segera setelah saya mencoba satu langkah ke depan, gdb melaporkan kesalahan "Tidak dapat menemukan batas fungsi saat ini" dan EIP tidak berubah.
Detil tambahan:
Kode mesin dihasilkan oleh pernyataan gcc asm dan saya menyalinnya ke lokasi memori kernel tempat ia dijalankan, dari keluaran objdump -d. Saya tidak keberatan dengan cara sederhana menggunakan loader untuk memuat kode objek saya ke alamat yang direlokasi, tetapi perlu diingat bahwa pemuatan harus dilakukan dalam modul kernel.
Saya kira alternatif lain adalah menghasilkan modul kernel palsu atau file info debug untuk diberikan kepada gdb, agar percaya bahwa area ini ada di dalam kode program. gdb berfungsi dengan baik pada kernel yang dapat dieksekusi itu sendiri.
(Bagi mereka yang benar-benar ingin tahu, saya menyisipkan kode saat runtime ke dalam ruang data kernel Linux di dalam VMware VM dan men-debugnya dari debugging jarak jauh gdb kernel melalui rintisan gdb bawaan VMware Workstation. Catatan Saya tidak menulis kernel eksploitasi; Saya seorang mahasiswa pascasarjana keamanan yang menulis prototipe.)
(Saya dapat mengatur breakpoint pada setiap instruksi di dalam assembly saya. Ini berfungsi tetapi akan menjadi sangat melelahkan setelah beberapa saat, karena ukuran instruksi perakitan x86 bervariasi dan lokasi perakitan akan berubah setiap kali saya reboot.)
Jawaban:
Anda dapat menggunakan
stepi
ataunexti
(yang dapat disingkat menjadisi
atauni
) untuk menelusuri kode mesin Anda.sumber
start
setara dengantbreak main
diikuti olehrun
(catatan:tbreak
bukanbreak
)Alih-alih
gdb
, larigdbtui
. Atau jalankangdb
dengan-tui
sakelar. Atau tekan C-x C-asetelah masukgdb
. Sekarang Anda berada dalam mode TUI GDB .Enter
layout asm
untuk membuat perakitan tampilan jendela atas - ini secara otomatis akan mengikuti penunjuk instruksi Anda, meskipun Anda juga dapat mengubah bingkai atau menggulir saat debugging. Tekan C-x suntuk masuk ke mode SingleKey, di manarun continue up down finish
dll. Disingkat menjadi satu tombol, memungkinkan Anda menjalankan program dengan sangat cepat.sumber
Hal paling berguna yang dapat Anda lakukan di sini adalah
display/i $pc
, sebelum menggunakanstepi
seperti yang telah disarankan dalam jawaban R Samuel Klatchko. Ini memberitahu gdb untuk membongkar instruksi saat ini sebelum mencetak prompt setiap kali; maka Anda dapat terus menekan Enter untuk mengulangistepi
perintah.(Lihat jawaban saya untuk pertanyaan lain untuk lebih detail - konteks pertanyaan itu berbeda, tetapi prinsipnya sama.)
sumber