Gdb'nin hedef yürütülebilir dosyasının dışındayım ve bu hedefe karşılık gelen bir yığınım bile yok. Yine de tek adımda yapmak istiyorum, böylece montaj kodumda neler olup bittiğini doğrulayabilirim, çünkü x86 montajında uzman değilim. Ne yazık ki, gdb bu basit derleme düzeyinde hata ayıklamayı yapmayı reddediyor. Uygun kesme noktasını ayarlamama ve durdurmama izin veriyor, ancak tek adımda ilerlemeye çalıştığım anda gdb "Geçerli işlevin sınırlarını bulamıyor" hatasını bildiriyor ve EIP değişmiyor.
Ek detaylar:
Makine kodu gcc asm ifadeleri tarafından oluşturuldu ve onu objdump -d'nin çıktısından çalıştırıldığı çekirdek bellek konumuna kopyaladım. Nesne kodumu yeniden konumlandırılmış bir adrese yüklemek için bir yükleyici kullanmanın basit bir yolunu kullanmaktan çekinmem, ancak yüklemenin bir çekirdek modülünde yapılması gerektiğini unutmayın.
Sanırım başka bir alternatif, gdb'ye verilecek sahte bir çekirdek modülü veya hata ayıklama bilgisi dosyası üretmek, bu alanın program kodu içinde olduğuna inanmasına neden olmak olabilir. gdb, çalıştırılabilir çekirdek üzerinde iyi çalışır.
(Gerçekten bilmek isteyenler için, bir VMware sanal makinesi içindeki Linux çekirdek veri alanına çalışma zamanında kod ekliyorum ve VMware Workstation'ın yerleşik gdb saplaması aracılığıyla çekirdeğin gdb uzaktan hata ayıklamasından hata ayıklama yapıyorum. Not Kernel yazmıyorum istismarlar; ben bir prototip yazan bir güvenlik mezunu öğrencisiyim.)
(Montajımın içindeki her talimat için bir kesme noktası belirleyebilirim. Bu işe yarıyor, ancak bir süre sonra oldukça zahmetli olacak çünkü x86 montaj talimatlarının boyutu değişiyor ve montajın konumu her yeniden başlattığımda değişiyor.)