Soru:
IDA'daki bir segment üzerindeki Oku / Yaz / Yürüt bayraklarını nasıl değiştirebilirim?
Peter Andersson
2013-07-02 10:53:22 UTC
view on stackexchange narkive permalink

Bazen IDA'da bir ikili dosyayı manuel olarak yüklediğinizde, sonunda bilinmeyen okuma yazma ve çalıştırma bayraklarına sahip segmentlerle karşılaşırsınız. Bunları Segmentler alt görünümü altında görebilirsiniz ( Shift + F7 ). Bir komut dosyası çalıştırmadan ve değiştirmeden bu bayrakları IDA'nın GUI'sinden değiştirmenin bir yolu var mı?

Hex Rays kod çözücünün düzgün çalışması için çok önemli olan temel bir işlevsellik parçası gibi görünüyor. Sınıfı, bu bayraklar var olduğu düşünüldüğünde yanlış görünen bölüm haklarını ifade etmek için kullanıyorum.

Genel durumda yanıtlanmasını memnuniyetle karşılayacak olsam da, bu özel durumda düz ile uğraşıyorum kod ve veri karıştırılmış ikili ARM dosyaları. Tüm sayfa düzeyinde izinler, yazılım yüklenirken MMU aracılığıyla doğrudan eşleştirilerek ayarlanır.

Dört yanıtlar:
Jason Geffner
2013-07-02 20:01:43 UTC
view on stackexchange narkive permalink

GUI'de, segment izinlerini değiştirmenize olanak tanıyan yerel olarak yerleşik bir şey bilmiyorum, ancak segment izinlerini IDC ile kolayca değiştirebilirsiniz.

IDA'nın yardım dosyasından:

  SetSegmentAttr ****************************************** ******* segment öznitelik bağımsız değişkenlerini ayarla: segea - bölüm özniteliği içindeki herhangi bir adres - SEGATTR _... sabit değerlerinden biri - özniteliklerin yeni değeri SetSegmentAttr (uzun segea, uzun öznitelik, uzun değer); SEGATTR_ALIGN hizalamaSEGATTR_COMB kombinasyonuSEGATTR_PERM permissionsSEGATTR_FLAGS segment bayraklarıSEGATTR_SEL segment seçiciSEGATTR_ES varsayılan ES değeriSEGATTR_CS varsayılan CS değeriSEGATTR_SS varsayılan SS değeriSEGATTR_DS varsayılan DS değeriSEGATTR_FS varsayılan FS değeriSEGATTR_GS varsayılan GS değeriSEGATTR_TYPE segment türüSEGATTR_COLOR segment rengi  

Segment.hpp'den:

  / * 22 * ​​/ uchar perm; // Segment izinleri (0-bilgi yok) #define SEGPERM_EXEC 1 // Yürütme # define SEGPERM_WRITE 2 // Yaz # define SEGPERM_READ 4 // Oku  

Bu şekilde, eğer ayarlamak istiyorsanız VA 0x00400000'de başlayan bir segmentin hem Okuma hem de Yürütme izinleri için aşağıdaki IDC komutunu çalıştırabilirsiniz:

SetSegmentAttr (0x00400000, SEGATTR_PERM, 4 | 1);

Alternatif olarak, yalnızca Hex-Rays'den gelen uyarılarla ilgilenmek istiyorsanız, GUI'deki Segment görünümünü kullanmak yeterli olabilir bir segmentin sınıfını CODE 'den DATA ' a değiştirin.

Çok zarif çözüm.
Teşekkürler, komut dosyası çözümlerinin farkındayım ve kendi ithalatçınızı yazıyorum. İkinci çözümünüzle ilgili olarak (şu anda kullandığım şey budur), bu uyarı ile ilgili değildir. Veri ve kodun karıştırılmasıyla ilgisi var. Hex Rays, düşük seviyeli yazılımlarla uğraşırken kod çözme üzerinde önemli olumsuz etkisi olan belirli segment türlerine gömülü sabit havuzlarla ilgili sorunlar yaşıyor. IDA'da yerleşik hiçbir şeyin olmamasına ve bir kısayol tuşuyla eşleştirilen komut dosyası çözümünün en kolay olanına doğru eğiliyorum.
Eklenti yazma zamanı = DI, bir Symbian Uygulamasına RCE uygularken, Ilfak ile bununla temasa geçtiğini belli belirsiz hatırladı. Segmentleri kaldırmam ve yeniden inşa etmem gerektiğini hatırlıyorum.
Diğer bir çözüm, segmenti temsil eden bir "segment_t" yapısının ".perm" üyesini doğrudan değiştirmektir.
PSS
2013-07-02 19:32:16 UTC
view on stackexchange narkive permalink

Bu sözde bayraklar, ikili dosyadan alınır. Örneğin Microsoft'un PE / COFF biçiminin ikilisini alalım. Bu, PE'nin temel düzenidir:

PE/COFF Layout

IDA'da gördüğünüz her segment, belirli bölümün IMAGE_SECTION_HEADER yapısına göre yüklenir / segment. Yapı şu biçime sahiptir:

  typedef struct _IMAGE_SECTION_HEADER {BYTE Adı [IMAGE_SIZEOF_SHORT_NAME]; sendika {DWORD PhysicalAddress; DWORD VirtualSize; } Çeşitli; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Karakteristikleri;} IMAGE_SECTION_HEADER, * PIMAGE_SECTION_HEADER;  

DDWORD Karakteristikleri yapının üyesi, bölüm için izin seviyelerini gösteren bayraklar içerir / segment. Çok sayıda farklı işaret mevcuttur, ancak bunlardan birkaçını saymak gerekirse: IMAGE_SCN_MEM_READ , IMAGE_SCN_MEM_WRITE ve IMAGE_SCN_MEM_EXECUTE .

IDA yürütülebilir dosyayı yükledikçe, bundan sonraki tüm iş veritabanı içinde yapılır. IDA tarafından yürütülebilir dosyada değişiklik yapılmaz. Bir segment üzerindeki okuma / yazma / yürütme izinlerini kalıcı olarak değiştirmek için yürütülebilir dosyanıza yama yapmanız gerektiğine inanıyorum. Bunu yapacak bir komut dosyası veya eklenti olmadığı sürece.

Bu durumda, ikili standart bir format kullanmamaktadır. Düz bir ikili dosyadan içe aktarılır. Dosya ARM kodu ve baştan sona bazı verilerdir. MMU eşlemelerini ve izinlerini değiştirerek doğrudan kendi segmentini haritalayan düşük seviyeli bir yükleyicidir.
@PeterAndersson "... MMU eşlemelerini ve izinlerini değiştirerek kendi segmentini doğrudan eşleyen düşük seviyeli bir yükleyici." Eşleme işlemi sırasında gerekli izinleri değiştirmek için ikili programa yama uygulayabilir misiniz?
Bu daha çok Hex Rays çözücünün bu özel durumda çeşitli segment türlerini ve bayrakları nasıl ele aldığı ile ilgili bir sorundur, ancak soru gerçekten daha geneldir. İkili dosyayı ilk içe aktardığınızda, RWX bayrakları bilinmeyen bir durumdadır, tersine mühendislik yaparken, segment MMU tarafından eşleştirildiğinde gerçek özniteliklerini keşfedersiniz. Aslına bakarsan, ikili düz bir dosyayı segment olarak içe aktarmanın ve bayrakları ayarlamanın bir yolu olduğunu bile düşünmüyorum.
tmr232
2015-07-01 21:33:46 UTC
view on stackexchange narkive permalink

Bunu Sark ( kod, dokümanlar) kullanarak yapabilirsiniz:

  import sark # Segmentsegment = sark.Segment ( ea = 0x00400000) # İzinleri ayarlayınsegment.permissions.write = True  

Sorumluluk reddi: Ben Sark'ın yazarıyım.

nettrino
2015-06-29 19:33:24 UTC
view on stackexchange narkive permalink

Önceki yanıtlara ekleyerek, bir python komut dosyası aracılığıyla başka bir segmentten öznitelikleri kopyalayabilirsiniz:

  try: attributes = [SEGATTR_ALIGN, SEGATTR_PERM, SEGATTR_BITNESS, SEGATTR_FLAGS, SEGATTR_SEL, SEGATTR_TYPE] from_seg_ea = list (Segments ()) [SegByName (attrs_from)] from_seg_ea == BADADDR: özniteliklerde öznitelikler için "öznitelikleri kopyalamada hata" yazdır: SetSegmentAttr (startea, attr, GetSegmentAttr (from_seg_ea, attr)) e: print e SegDelete olarak Exception (startea, 1)  

@startea, segmentinizin başlangıç ​​adresidir, @ attrs_from, öznitelikleri kopyalamak istediğiniz segmenti temsil eden bir dizedir (örneğin, ".text")



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...