تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[تمرين] حللني ان استطعت
#1
اتباعا لفكرة قسم التحديات، اضع امامكم بنفس المبدأ تحدي برمجي...
تمرين "حللني ان استطعت" هو عبارة عن تطبيق يقوم بانجاز مهمة بسيطة.

المطلوب:
- تحليله و فهم ما يقوم به و اخيرا اعادة كتابة التطبيق بأي لغة برمجة تريدون...

الملفات التنفيذية بدون الحلول ترفق في نفس الموضوع و بعد ثلاثة ايام ان شاء الله تطرح الحلول الصحيحة...

ملاحظة:
المشاركة في محاولة حل التمرين مفتوحة، يمكنكم طرح الاستسفارات و كل الأعضاء يمكنهم الاجابة بدون تقييدات...

رابط خارجي: فرصة للأعضاء الذين بريدون الحصول على نقاط :
https://www.solidfiles.com/v/eWMmKYk7kLGaK


الملفات المرفقة
.rar   main32.rar (الحجم : 485 bytes / التحميلات : 13)
أعضاء أعجبوا بهذه المشاركة : Cyperior , ashrafonlinenow , siddigss , rce3033 , PowerUser
#2
بما أن المشاركة الجماعية مفتوحة، لعلي أضع بعض ملاحظاتي وأسئلتي.
للوضوح، سأستعمل ال structures التالية لـ :
 
File Header
https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_file_header
Optional Header
https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32

------------------------------------------------------
------------------------------------------------------

1- يبدو أن البرنامج يقوم بفك تشفير مصفوفة الحروف (char*) من العنوان 0x04000E2 إلى آخر الملف المكتوب المرفق ويكتب النتيجة ابتداء من العنوان 0x420000، حيث يمكننا أن نرى اسدعاء دالة printf هناك.

2-
IMAGE_OPTIONAL_HEADER32.SizeOfImage = 0x020077EB
هذا هو ما يسمح للبرنامج بالوصول إلى عنوان الذاكرة 0x420000 وما بعد، أليس كذلك ؟

3- جدول ال section فارغ، أي
IMAGE_FILE_HEADER.NumberOfSections = 0
هل من فائدة للربط (linking) بهذه الطريقة ؟ أهذا لتجنب عملية ال relocation ؟
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة : Cyperior , HORMA , rce3033
#3
(27-03-2021, 01:04 PM)overlap كتب : اعادة كتابة التطبيق بأي لغة برمجة تريدون...

يبدو لي هذا Crafted exe ؟
أعضاء أعجبوا بهذه المشاركة :
#4
الجزء الأول من التمرين:

التطبيق مضغوط بــ (Crinkler) Compressor على شكل Linker مخصص لتطبيقات الــ Demo scene الصغيرة الحجم في اساسها...
إقتباس : Crinkler is an executable file compressor (or rather, a compressing linker) for Windows for compressing small demoscene executables. As of 2020, it is the most widely used tool for compressing 1k/4k/8k intros.
https://github.com/runestubbe/Crinkler

الملف الناتج (على القرص) يصبح صعب التحليل (Static analysis) بسبب التعديلات  التي يقوم بها Crinkler على بنية الملف التنفيذي (PE File structures) و بما ان ادوات التحليل و المنقحات تقوم بقراءة عناوين و احجام الحقول التي تكون هيكل الملف التنفيذي، سوف تعتبر ان الملف التنفيذي تالف Corrupted، و تصبح هذه الأدوات عير عملية...

الجزء الثاني من التمرين:
ايجاد و فهم عمل الخوارزمية التي تعالج كلمة AT4RE و محاكاتها باي لغة برمجة تريدون...
أعضاء أعجبوا بهذه المشاركة : rce3033
#5
بعد فك الضغط وإصلاح عناوين الدوال المستوردة، البرنامج يبدأ من 0x0042006A. بتتبع أوامر التجميع (الأسملبي) يبدو أن البرنامج يقوم بالتالي
 
    char text[6] = "AT4RE";
    char textToPrint[6] = "";
    int a = 5;
    int i;
    for (i = 0; i <= a; i++) {
        textToPrint[i] = (char) (text[i] ^ a);
    }

    for (i = 0; i < a; i++) {
        text[i] = (char) (textToPrint[i] ^ a);
    }

    printf("%s", text);
    getchar();

البرنامج يقوم بعمل xor مع العدد 5 لكل حرف من حروف مصفوفة الحروف text ويخزنه في مصفوفة حروف ولنسمها textForPrint، ومن ثم يقوم بعمل  xor مع العدد 5 لكل حرف من حروف مصفوفة الحروف textForPrint ويتكب النتيجة في text. قيمة text لن تتغير لأن عملية xor مرتين مع نفس العدد لا تغير النتيجة أي
(x xor c) xor c = x

إذا كان البرنامج أكبر، فسنحتاج إلى كتابة decompressor عام.


ملاحظة: عند تتبع البرنامج ضع hardware break point عند 0x0042006A، لأن وضع software break point يغير من التعليمات المكتوبة في المنطقة التي سيقوم البرنامج بفك ضغطها.
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة : Cyperior , rce3033
#6
(05-09-2021, 02:35 PM)siddigss كتب : البرنامج يقوم بعمل xor مع العدد 5 لكل حرف من حروف مصفوفة الحروف text ويخزنه في مصفوفة حروف ولنسمها textForPrint، ومن ثم يقوم بعمل  xor مع العدد 5 لكل حرف من حروف مصفوفة الحروف textForPrint ويتكب النتيجة في text. قيمة text لن تتغير لأن عملية xor مرتين مع نفس العدد لا تغير النتيجة أي

ممتاز اخي، عمل رائع...
عملية XOR لكلمة AT4RE و حفظ الناتج في Buffer ثم اعادة العملية هذه المرة على ما يحتويه الــ Buffer ثم اظهار الناتج... طبعا باعتماد نفس المفتاح للمرحلتين...

الهدف من التمرين كان اغراق اوامر هذه العملية البسيطة داخل اوامر اخرى هدفها منع نجاح عملية التحليل...

بارك الله فيك على اثراء الموضوع...
أعضاء أعجبوا بهذه المشاركة : Cyperior , rce3033


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم