kullanırken kayıt değerlerini belirleme Bu nedenle, derlemeden bir Kontrol Akışı Grafiği oluşturmak için objdump yardımcı programını kullanmaya çalışıyorum ve bir sorunla karşılaşıyorum. Temel olarak, bir şube oluştuğunda ve hedef adres göreli olduğunda, bir sonraki temel bloğun nerede başladığını bilmiyorum. Net olup olmadığından emin değilim, bu yüzden bir örnek ekleyeceğim. Programımın objdump çıkışı üzerinden geçtiğini ve ilk temel bloğun başlangıç adresini kaydettiğini söyle. Ardından, atlanacak uygun adrese işaret etmek için göreli adresleme kullanan bir atlama komutuna basar. İlk temel bloğumun sonunun şu anda gerçekleştiğini biliyorum, ancak bir sonraki temel bloğun başlangıcında doğru adresi almak için nasıl giderim? Herkesin sağlayabileceği herhangi bir rehberlik büyük bir memnuniyetle karşılanacak, ben en iyi x86 acemi değilim ve kafamı geçen hafta boyunca buna karşı çarpıyorum.objdump
objdump
cevap
Soruyu anladığımı varsayarsak, belki bu sizin başlayacaktır. Bağıl atlar pc tabanlı.
d: eb 04 jmp 13
0xEB, 8 bitlik bir anında temel alınan göreli bir atlama için kullanılan opodtur. Talimatın adresi, objdump çıkışında, bu durumda d veya 0xD'dir. iki bayttır (x86 değişken uzunluktadır). size çıkış adresinin ne olduğunu, bu durumda jmp 13 olduğunu söyler. Böylece 13 ile başlayan objdump çıkışındaki çizgiyi aramak ve bir sonraki kolon kodunun başlangıcı bir kolondur.
Bu adresin nasıl hesaplandığını anlamak için. Komutu getirmeye başladığında bilgisayar 0xD seviyesindedir, iki bayt alır, bu yüzden bu komutu yürütmeye hazır olduğunda pc 0xD + 2 = 0xF'dir. Ofset 0x4 yani, 0xF + 0x4 = 0x13 hedef adres.
20: 75 ed jne f
Aynı şey arkaya doğru gider. pc artı bayt sayısı = 0x20 + 2 = 0x22. 0xED, imzalı bir sayıdır ve bu nedenle 0xEFFFFFFF ... FFFFED'e kadar 0xED işareti uzatılır, ancak adres kayıtlarınız büyüktür. 0x22 + 0xFFFFFF ... FFFED ekleyin ve hedef adresi 0x0F olsun. Ayrıca 0xED, invert ve onu reddetmek için 1 ekleyebilirsiniz. ~ 0xED = 0x12, 0x12 + 1 = 0x13. Yani 0xED, 0x13 çıkar demektir. 0x22-0x13 = 0x0F.
Biraz daha var, her durumda size sadece objdump çıkışında arayabileceğiniz hedef adresi veriyor.
Bu değeri nasıl hesapladığını anlamak için. Aynı hikaye, 0x400A81'de opcode ile başlar, değişken uzunluktaki komut için bu durumda 6 bayt alır. Yani, PC'yi çalıştırmaya hazır olduğunuzda, 0x400A81 + 6 = 0x400A87. Ofset 0x107 olur, bu durumda koşul yerine getirilirse, hedef adres 0x400A87 + 0x107 = 0x400B8E'dir.
Bunlar daha büyük bir programdan değil, sıralı koddan değil, sadece izole edilmiş örneklerden oluşan bir koleksiyondan arındırılır.
400a81: 0f 8f 07 01 00 00 jg 400b8e 400a8f: 0f 8f e6 00 00 00 jg 400b7b 400a9d: 0f 8f c5 00 00 00 jg 400b68 400aab: 0f 8f a4 00 00 00 jg 400b55 400ab9: 0f 8f 83 00 00 00 jg 400b42 401d76: 0f 8f 31 01 00 00 jg 401ead
- 1. bulma yerleri (gcc/objdump -d)
- 2. Bir dosyaya objdump sonucunu nasıl gönderirim?
- 3. GNU binutils (objdump) nasıl kullanılır/yüklenir
- 4. readelf vs. objdump: neden her ikisi de ihtiyaç duyuyoruz
- 5. Bir adrese objdump verebilir miyim ve içerdiği işlevi parçalarına ayırabilir miyim?
- 6. Glibc ve pthread kütüphaneleri neden aynı API'ları tanımladı?
- 7. her linux bash çıkış hattını regexp
- 8. .data bölümünün init verilerini nereden alması gerektiğini nereden öğrenebilirim? (gcc linker)
- 9. Linux kernel görüntüsünden yapılandırma alma
- 10. ld veri dosyası veri boyutunu yapar bir * ABS * ve bir tam sayı değil
- 11. bölüm özniteliği, GCC
- 12. Yerel işlev çağrılarının amacı nedir?
- 13. Sublime Text ile montaj çıktısı nasıl üretilir?
- 14. gc ile bir dosya biçimi oluşturuluyor
- 15. Çapraz platformda bir c ikilisinin işlev adlarını aramanın en kolay yolu nedir?
- 16. g ++ sembol '_end' kullanılması
- 17. Gdb yükleme sembolleri, yüklü bir kitaplığı nasıl oluşturur?
- 18. Makefile'ye farklı derleyicileri kullanma talimatı veriliyor
- 19. Neden değişkenin adresi
- 20. REX.B geçersiz kılma, MOVSS talimatıyla çalışır mı?
- 21. C# dan çağrı dumpbin tanınmıyor mu?
- 22. Git neden kendi Kod üretecini kullanıyor?
- 23. Ortak bir kitaplıktan genel bir değişkenin harita kümeleriyle eşleştirilmesi
- 24. Nesnenin şeridini yalnızca tutmak için hata ayıklaması nasıl tersine çevrilir?
- 25. Bazı işlevlerin sıyrılmasını nasıl engellerim?
- 26. GNU assembler yönergesinin x86 "mov.s" belgesinde ".s" gibi ekleri nerede bulunur?
- 27. Tanımlanmamış başvuruyu _imp __ * ile nasıl gideririm?
- 28. Soyulmuş Linux çekirdeğinin yük adresini ve giriş noktasını belirleyin. Kernel image
- 29. Yığın Belleğini C programından değiştirme
- 30. Minimal Uzay Kullanımı için Hizalanmış Nesnelerin Düzenlenmesi Sırası
Çok teşekkür ederim, bu benim sorunumun çoğunu temizliyor. Temel olarak, üzerinde çalıştığım objdump çıkışını tam olarak anlamıyorum gibi görünüyor. Nesne çıkışı hakkında daha fazla şey öğrenmek için iyi bir kaynak bilen var mı? – Sam
Bazı çıktıları tekrar okuyorum ve bu kesinlikle çok açıklığa kavuşuyor. Yine de bunun gibi bir çizgiden emin değilim: 4020a6: \t ff 25 4c 8f 21 00 jmpq * 0x218f4c (% rip) # 61aff8 <_fini + 0x207840> Temelde tamamen objdump çıkışını tam olarak anlamadım gibi görünüyor ile çalışıyorum. Nesne çıkışı hakkında daha fazla şey öğrenmek için iyi bir kaynak bilen var mı? – Sam
Ne aradığınızı söyleyebilirim x86 assembler'ı mutlaka objdump değil anlamaktır. Bu özel komutun op kodu bana atlamamaktadır (amaçlanan herhangi bir amaç yoktur), fakat sözdizimi, kayıt temelli bir şey olduğunu, hedef adresin çalışma zamanında% rip içeriğiyle ilgili olması gerektiği anlamına gelir. temelde tablo.Ve bu kodu yerine getirmediğinizden, sadece inceleme yaptığınız için% rip içeriğinin ne olduğu açık olmayabilir ve sonuç olarak hedef adresin ne olduğunu anlamayabilirsiniz. –