إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

بنية ملفات elf

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [مقال] بنية ملفات elf

    بسم الله الرحمن الرحيم

    ادا كنت مهتما بالهندسة العكسية تحت بيئة Linux فانك ولابد سوف تحتاج لهدا المقال فكما هو معروف لكل من يزاول فن الهندسة العكسية اهمية معرفة بنية الملف التنفيدي ففي Winows مثلا هناك بنية PE اما في Linux فهناك ELF لدلك سوف احاول بادن الله ان اضع موضوعا بسيطا حول هده البنية خصوصا انني لم ارى اي مقال عربي يعرض هده البنية بشكل نهائي (حسب بحثي) فعلى بركة الله.

    بنية ELF اختصار لجملة Executable and Linking Format تم تطويرها من طرف نظام UNIX لكي تكون عبار عن ملف غرضي (object file) قابل للاشتغلال تحت بيئات مختلفة التي تستخدم معالج Intel .

    كما هو الامر بالنسبة ل بنية PE فان بنية ELF تحتوي على اقسام (sections) و جداول (Tables) و ترويسة (Header) و..



    قبل التعمق بشكل اكثر اود ان اشير الى ان بنية ELF يمكن مجازيا التعبير عنها بشكلين شكل في الداكرة وشكل في القرص الصلب وكل ما ساتناوله هو فقط الشكل المتعلق بالقرص الصلب ولن اتطرق للكيفية التي يعمل بها البرنامج في الداكرة.

    ان كل ملف ELF يحتوي على Header Table وهو اشبه بخريطة تصف الملف بشكل دقيق وهده هي بنيتة

    كود PHP:
    typedef struct
    {
      
    unsigned char e_ident[EI_NIDENT];     
      
    Elf32_Half    e_type;                
      
    Elf32_Half    e_machine;             
      
    Elf32_Word    e_version;              
      
    Elf32_Addr    e_entry;                
      
    Elf32_Off     e_phoff;                
      
    Elf32_Off     e_shoff;                
      
    Elf32_Word    e_flags;                
      
    Elf32_Half    e_ehsize;              
      
    Elf32_Half    e_phentsize;           
      
    Elf32_Half    e_phnum;              
      
    Elf32_Half    e_shentsize;            
      
    Elf32_Half    e_shnum;               
      
    Elf32_Half    e_shstrndx;             
    Elf32_Ehdr
    هده البنية تمكننا من معرفة عدة معلومات مهمة مثلا e_machine تمكننا من معرفة البيئة التي تم عمل compile فيها للبرنامج و e_entry تمكننا من معرفة نقطة دخول البرنامج اي العنوان الدي سيبدا منه البرنامج بالاشتغال والعديد العديد بالطبع كل واحد من البيانات المعرفة في البنية يمكننا ان نجعله موضوع بحد داتها ولكنني لن اتوقف عندها

    program header
    هو عبارة عن خريطة بدوره يخبر النظام عن كيفية انشاء اجراء يخص هدا البرنامج ان صح التعبير

    section header table هو عبارة عن جدول كل خانه من هدا الجدول ان صح التعبير تحتوي على section header خاص ب section ما و section header معرف كالتالي

    كود PHP:
    typedef struct
    {
      
    Elf32_Word    sh_name;                
      
    Elf32_Word    sh_type;               
      
    Elf32_Word    sh_flags;              
      
    Elf32_Addr    sh_addr;               
      
    Elf32_Off     sh_offset;              
      
    Elf32_Word    sh_size;              
      
    Elf32_Word    sh_link;                
      
    Elf32_Word    sh_info;               
      
    Elf32_Word    sh_addralign;           
      
    Elf32_Word    sh_entsize;            
    Elf32_Shdr
    وهده البنية كسابقتها مهمة جدا فهي تعطي لنا عدة معلومات حول section مثلا sh_name يعطي اسم section و sh_addr يعطي لنا عنوان section في الداكرة بعد التشغيل و sh_flags يعطي لنا خصائص section هل هي قابلة للكتابة هل هي قابلة للقرائة ...

    واخيرا وليس اخرا sections التي تتعلق بالبرنامج ولكن هناك ما يعرف ب special sections اي الاقسام الخاصة والتي هي عبارة عن اقسام محجوزة من طرف النظام وهده الاقسام مسبوقة بنقطة في اسمها وهي كالتالي (ليست كلها وبالطبع قد لا توجد كلها في البرنامج)

    كود PHP:

    .bss 
    .comment 
    .data 
    .data1 
    .debug 
    .dynamic 
    .dynstr 
    .dynsym 
    .fini 
    .got 
    .hash 
    .init 
    .interp 
    .line 
    .note 
    .plt 
    .relname 
    .relaname 
    .rodata 
    .rodata1 
    .shstrtab 
    .strtab
    .symtab 
    .text 
    بالطبع اهمها هو text الدي يحتوي على تعليمات البرنامج

    بالطبع كما دكرت في بداية الموضوع ان الموضوع لن يكون معمقا بشكل كبير لانه فعلا هناك عدة امور جميلة ويصعب دكرها كلها في موضوع بسيط.

  • #2
    بالطبع كما دكرت في بداية الموضوع ان الموضوع لن يكون معمقا بشكل كبير لانه فعلا هناك عدة امور جميلة ويصعب دكرها كلها في موضوع بسيط.
    نسقها في كتاب (مثلا)
    أو انشرها في مجلة المجتمع والتي تصدر الشهر القادم بمشيئة الله ،
    (لَا تَحْسَبَنَّ الَّذِينَ يَفْرَحُونَ بِمَا أَتَوا وَّيُحِبُّونَ أَن يُحْمَدُوا بِمَا لَمْ يَفْعَلُوا فَلَا تَحْسَبَنَّهُم بِمَفَازَةٍ مِّنَ الْعَذَابِ وَلَهُمْ عَذَابٌ أَلِيمٌ)
    آل عمران 188
    قال رسول الله صلى الله عليه و سلم :
    {لا يشكر الله من لا يشكر الناس}
    {من كان يؤمن بالله واليوم الآخر،فليقل خيراً أو ليصمت}

    جميع المساهمات الحاملة لهذا التوقيع تخضع لرخصة وقف
    أسأل الله العظيم رب العرش العظيم أن يحسن من حال أمتي

    تعليق


    • #3
      السلام عليكم

      شكرا محمد على المقالة الرائعة، هناك أخرى متوسعة تجدها في العدد 4 من مجلة فريق الهندسة العكسية ARTeam، مقالة متكاملة بمثال crackme

      بالتوفيق

      تعليق


      • #4
        ان كل ملف ELF يحتوي على Header Table وهو اشبه بخريطة تصف الملف بشكل دقيق وهده هي بنيتة

        كود PHP:
        typedef struct
        {
        unsigned char e_ident[EI_NIDENT];
        Elf32_Half e_type;
        Elf32_Half e_machine;
        Elf32_Word e_version;
        Elf32_Addr e_entry;
        Elf32_Off e_phoff;
        Elf32_Off e_shoff;
        Elf32_Word e_flags;
        Elf32_Half e_ehsize;
        Elf32_Half e_phentsize;
        Elf32_Half e_phnum;
        Elf32_Half e_shentsize;
        Elf32_Half e_shnum;
        Elf32_Half e_shstrndx;
        }
        Elf32_Ehdr;


        هده البنية تمكننا من معرفة عدة معلومات مهمة مثلا e_machine تمكننا من معرفة البيئة التي تم عمل compile فيها للبرنامج و e_entry تمكننا من معرفة نقطة دخول البرنامج اي العنوان الدي سيبدا منه البرنامج بالاشتغال والعديد العديد بالطبع كل واحد من البيانات المعرفة في البنية يمكننا ان نجعله موضوع بحد داتها ولكنني لن اتوقف عندها
        ما هي Elf32_Half و هل تتغير مع تغير نوع المعالج؟
        ".Use the source d00d."

        تعليق

        يعمل...
        X