ghidra disassembler sorunu

Mesela şu string

37431 eklentisine bak

İlgili kod spesifik olarak string'in ortalarından bir yerden alıyor.

37432 eklentisine bak

Bütün string'lerde bu durum yok. İstatistiğini bilmiyorum birçok doğru yerden adresi alınan string de görüyorum yanlış alınan da görüyorum. Her zaman hata 4 ün katı da değil. Bazan 2 kayma da olabiliyor.

Hangi kisim icin hata oldugunu dusunuyorsun?

405b54d8 adresindeki uint 32 bit veri nedir?
 
405b54d8 adresi, ilgili LDR komutuna yakın olan bir adres, relatif adresleme ile içeriği yükleniyor. İçeriği de string'in başlangıç adresi olması lazım iken string'in ortası

1730123489056.png


İçeriği de bir adres

1730123538731.png


Ama string baştan itibaren "Retry block recover ..." diye başlayacağına "failure ..." diye başlıyor.
 
405b54d8 adresinde 4079d704 adresi sakli. Verdigin adresdekileri ASCI degil de hex yorumla.

O halde senin stringin 4079d704 adresinde.

1730124620210.png
 

Ekler

  • 1730124525523.png
    1730124525523.png
    10.9 KB · Görüntüleme: 7
405b54d8 adresinde 4079D704h var. Ekran çıktısını koydum yukarıda.
 
@Mikro Step konu ile ilgili senle ortak bir noktaya gelemedik bir türlü. ARM ın adresleme modlarını biliyorum, burada bir sorun yok. Sorun, o adresteki string, baştan itibaren kullanılırsa mantıklı. Hata mesajı var orada, haliyle o hata mesajının tamamını yazdırmak istersin, yarısından sonrasını değil.
 
O da yukarıdaki mesajda var. Oradaki ekran çıktısını göremiyor musun? 4079D704 adresi aşağıdaki stringin ortasına geliyor. Şu mesajda belirttim

 
Şu anda başka bir ihtimal aklıma geldi problem ile ilgili. Biraz daha bakayım sonra paylaşırım.
 
4079D704 adresinde ne var hic vermedin ki. 4079d6dc adresindeki stringi verdin o da 4079D704 adresine ulasamiyor bile.
 
1730127027085.png


Yukarıdaki görüntüye bakarsan, orada string'in başlangıç adresi 4079d6dc. Orada bir tane de XREF verilmiş. 405b4e00 adresindeki fonksiyon, tam olarak 405b509c adresindeki bir komut ile 4079d704 adresine erişiyor. O adres de, gri renkli yazıda belirtildiği gibi bu stringin içindeki "failure" un "f" harfine işaret ediyor.

Yani fonksiyon "Retry block recover because of flash op failure ..." gibi bir string okuyacağına, "failure ..." diye bir stringi okuyor.
 
Acizane fikrim şöyle.
Siz bir kod derleyip hex oluşturun benzer şekilde ve disassembly yapmaya çalışın.
Sanırım buradan başlamak en doğrusu olur.
 
İşin tuhaf tarafı bu string böyle, ama çok sayıda doğru okuduğu, yani baştan okuduğu string de var. Offset de tamamen değişken, belli bir pattern bulamadım.
 
Acizane fikrim şöyle.
Siz bir kod derleyip hex oluşturun benzer şekilde ve disassembly yapmaya çalışın.
Sanırım buradan başlamak en doğrusu olur.

Bir programı kaynak koddan derleyip ghidra'ya yüklersen, hiçbir bilmece kalmıyor. Fonksiyon isimleri, değişken isimleri, programın boyutu, yükleme adresi, başlama noktası, her şey apaçık belli oluyor.
 
Bir programı kaynak koddan derleyip ghidra'ya yüklersen, hiçbir bilmece kalmıyor. Fonksiyon isimleri, değişken isimleri, programın boyutu, yükleme adresi, başlama noktası, her şey apaçık belli oluyor.
Derlediğin hex haline gelince de mi?
 
Derlediğin hex haline gelince de mi?

Hex'de gelmez, ama oradaki yapılar az çok belli olacak. Genelde ELF programlarda entry point 0x8000 adresi oluyor. Vektörler 0 adresinde oluyor. Her vektörün neyi temsil ettiği belli.

Ama bu DL3021 programında hiçbir şey belli değil. Hangi adrese yükleniyor, başlangıç noktası, program neresi, data neresi, vektör neresi belli değil. Ben şöyle ilerledim bunda:

Önce i.mx283 peripheral registerlerini çıkardım. Sonra bir python script yazım ghidra'da tanımladım. Böylece bu registerlerin nerede kullanıldığı ortaya çıktı. Sonra da clock yapılandırma registerlerinin kullanıldığı yeri tespit edip oradan da geriye doğru gide gide, başka hiç kimsenin çağırmadığı "top level" fonksiyonu buldum. Bunun init fonksiyonu olduğunu varsaydım. Ama tabi kesin birşey hala yok. Belki başka bir init fonksiyonu var ve adresi dinamik olarak belirleniyor. Veya bu bir RTOS ise o zaman bir sürü kesinlikle dönmeyen ve başkasının çağırmadığı fonksiyon olacak.

Neyse, sonra string'lere baka baka birkaç tane printf tarzı iş yapan fonksiyon tespit ettim. İşte bu fonksiyonlara giren stringlere bakıyorum şimdi. Kimisi assert, kimisi hata mesajı, kimisi debug log mesajı. Ama doğru offsetten başlamıyorlar.
 
37444 eklentisine bak

Yukarıdaki görüntüye bakarsan, orada string'in başlangıç adresi 4079d6dc. Orada bir tane de XREF verilmiş. 405b4e00 adresindeki fonksiyon, tam olarak 405b509c adresindeki bir komut ile 4079d704 adresine erişiyor. O adres de, gri renkli yazıda belirtildiği gibi bu stringin içindeki "failure" un "f" harfine işaret ediyor.

Yani fonksiyon "Retry block recover because of flash op failure ..." gibi bir string okuyacağına, "failure ..." diye bir stringi okuyor.

1730128692825.png


Kafayi yiyecegim. verdigin string 4079d6dc adresinden basliyor.

30 tane karakter var orda, string adresine eklersek 4079d6dc + 1E = 4079D6FA yani gormeyi arzuladigim 4079D704 adresine daha ulasilamadi bile.

Senin icin sorun cozuldu ama bana da aci. 4079D704 adresinde nasil bir string var?
 
4079D704 - 4079d6dc = 0x28 = 40

"Retry" kelimesinin R sinden başlayıp 40 karakter ileri gidersen, "failure" un f sine ulaşıyorsun.
 
bir de 30 karakter yok. String daha uzun, ama işte ghidra sadece bir kısmını yazıp gerisini ... demiş. Ama 4079D704 gösterilenler arasında.
 
Hmm evet şimdi şüphelendiğim şeyi destekleyen bir veri gördüm. String'i baştan başlayan, yani sorunsuz görünen bir printf call buldum. Fonksiyona format string'inde iki tane arguman vardı, %s ve %d. Ama printf fonksiyonuna sadece bir integer veriliyor argüman olarak. Demekki bu format string'i bu fonksiyona ait değil. Yani programın yükleme adresi doğru değil.

Bunda 64 MByte DRAM var ve 0x40000000 adresinden başlıyor. Ben de programın en baştan yükleneceğini varsayarak o şekilde yükledim. Programın kendisinde herşey relatif olduğu için kod işleyişinde bir sorun olmuyor, ama string yüklemelerinin yapıldığı değişkenlerde yazılı olan adresler MUTLAK adres.

Bu durumda benim farklı yükleme adresleri denemem lazım. Öyle bir adres bulacağım ki, bütün string'ler yerine oturacak :katil2:
 

Çevrimiçi personel

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,811
Mesajlar
116,026
Üyeler
2,772
Son üye
Burhan Öz

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Back
Top