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

المطلوب:
- تحليله و فهم ما يقوم به...

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

لفهم العملية اكثر، يرجى الاطلاع على المواضيع السابقة:
https://www.at4re.net/f/thread-2668.html
https://www.at4re.net/f/thread-2834.html
أعضاء أعجبوا بهذه المشاركة : Cyperior , rce3033 , the9am3
#2
هل من المتعمد أن نسخة 64-bit لا تعمل، فهي لأجهزة ARM64 ؟ بينما نسخة 32-bit تعمل.
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة :
#3
(07-09-2021, 05:26 PM)siddigss كتب : هل من المتعمد أن نسخة 64-bit لا تعمل، فهي لأجهزة ARM64 ؟ بينما نسخة 32-bit تعمل.

نعم اخي...
أعضاء أعجبوا بهذه المشاركة :
#4
جربت شوية مع نسخة ال32 بت البرنامج 
اذا انشغلة من cmd 
بالبداية راح يبحث عن ملف dll اسمة T4RE.DLL  بااكثر من مكان وبعدها

[صورة مرفقة: Screenshot-2021-09-08-002638.png]
راح يعمل سكرين شوت لل taskbar و بااسم AT4RET.AT4RE اذا نفتح الملف بالhex راح انشوف هيدر BM وهذه خاصة ب bmp اذا غيرنا صيغة الملف الى bmp يكون عبارة عن صورة لل taskbar



https://labs.k7computing.com/index.php/c...ownloader/
أعضاء أعجبوا بهذه المشاركة : rce3033
#5
البرنامج يقوم بالتالي


#include "pch.h"
#include <Windows.h>
#include <mbstring.h>

const char* AT4RE = "AT4RE";
const char* DOT_AT4RE = ".AT4RE";

HWND p;
RECT WINDOW_RECT;

BOOL CALLBACK f(HWND h, LPARAM param) {
    
    char A[0xC8];

    memset(A, 0, 0xC8);
    p = h;
    _mbscpy((unsigned char*)A, (unsigned char*)AT4RE);
    //char tempBuffer[0xC];
    //strcat(A, itoa((int)p, tempBuffer, 0x10));
    strcat(A, (char*)p);
    strcat(A, DOT_AT4RE);

    HDC dc = GetDC(p);
    GetWindowRect(p, &WINDOW_RECT);
    int height = WINDOW_RECT.bottom - WINDOW_RECT.top;
    int width = WINDOW_RECT.right - WINDOW_RECT.left;
    int area = height * width;
    int modifiedArea = area * 4 + 39;
    HGLOBAL mem = GlobalAlloc(0x40, modifiedArea);
    
    *(short*)(mem) = 0x4D42;
    *(int*)((byte*)mem + 0x2) = 0xE;
    *(int*)((byte*)mem + 0xA) = 0x36;
    *(int*)((byte*)mem + 0xE) = 0x28;
    *(short*)((byte*)mem + 0xE + 0xC) = 0x1;
    *(short*)((byte*)mem + 0xE + 0xE) = 0x18;
    *(int*)((byte*)mem + 0xE + 0x8) = height;
    *(int*)((byte*)mem + 0xE + 0x4) = width;
    *(int*)((byte*)mem + 0xE + 0x10) = 0;

    HDC cdc = CreateCompatibleDC(dc);
    HBITMAP bitmapHandle = CreateCompatibleBitmap(dc, width, height);
    SelectObject(cdc, bitmapHandle);
    BitBlt(cdc, 0, 0, width, height, dc, 0, 0, 0x40CC0020);
    GetDIBits(cdc, bitmapHandle, 0, height, (LPVOID)((byte*)mem + 0x36), (LPBITMAPINFO)((byte*)mem + 0xE), 0);

    HANDLE file = CreateFileA(A, 0x40000000, 2, 0, 2, 0, 0);
    int numberOfBytes;
    WriteFile(file, mem, modifiedArea, LPDWORD(&numberOfBytes), 0);
    CloseHandle(file);
    GlobalFree(mem);
    
    return true;
}



int main() {
    char someArray[0x10];
    HWND windowHandle = FindWindowA("Notepad++", NULL);
    EnumChildWindows(windowHandle, f, (LPARAM)someArray);
    return 0;
}



سابقاً: لكن هذا المكتوب أعلاه غالبا ليس صحيحا تماما فلم أحصل على نفس النتيجة بعد. سأكمل غدا فقد حان وقت النوم ignore ، ومن أراد أن يكمل بدلا عني فليتفضل.
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة : rce3033 , Cyperior
#6
الكود المكتوب أعلاه الآن يمثل "الأوامر" التي يقوم بها البرنامج. يبدو أن دالة EnumChildWindows التي تقوم بتمرير handle النوافذ الجزئية إلى الدالة f لا تتبع دائما نفس الترتيب وهذا يؤدي إلى نتائج متباينة...


أوضّحُ عملية التحقق التي اتبعها.

للتأكد من أن المكتوب يقوم حقا بما يقوم به البرنامج قمت بإلغاء السطر 22 من الكود المكتوب وإضافة السطرين 21 و 20 وفي هذه الحالة نحصل على عدد من الملفات كل منها اسمه يتضمن handle نافذته.
بالتأكيد علينا القيام بنفس العملية للبرنامج المطلوب تحليله في السؤال، فنشغله في منقح ونضع نقطة توقف عند أول استدعاء للدالة strcat في البرنامج واستبدال تلك التعليمة ب jmp 00420277 الذي هو بمثابة code cave.

وفي العنوان 00420277 يمكننا كتابة
00420277  | 83EC 0C                | sub esp,C                                   |
0042027A  | 6A 10                  | push 10                                     |
0042027C  | 8D4424 04              | lea eax,dword ptr ss:[esp+4]                | [esp+4]:"lW"
00420280  | 50                     | push eax                                    | eax:"AT4RE40104"
00420281  | 56                     | push esi                                    | esi:"lW"
00420282  | E8 A9082077            | call <msvcrt._ltoa>                         |
00420287  | 90                     | nop                                         |
00420288  | 50                     | push eax                                    | eax:"AT4RE40104"
00420289  | FF7424 1C              | push dword ptr ss:[esp+1C]                  |
0042028D  | E8 94FFFFFF            | call <JMP.&strcat>                          |
00420292  | 83C4 20                | add esp,20                                  |
00420295  | 90                     | nop                                         |
00420296  | 90                     | nop                                         |
00420297  | 90                     | nop                                         |
00420298  | E9 41FEFFFF            | jmp understand_me32.4200DE                  |

لاحظ أن عناوين itoa و strcat وعنوان القفزة في آخر سطر يمكن أن تتغير فعليك كتابتها يدويا، وللتوضيح القفزة الأخيرة تؤشر إلى التعليمة التي تلي أول استدعاء ل strcat الذي استبدلانه بالأعلى.

بعد السماح للبرنامج بإتمام عمله نحصل على عدد من الملفات تتضمن handle نوفاذها كما في الكود المكتوب في المشاركة السابقة، وبالنظر إلى أحجام الملفات وعددها يبدو أن الملفات متطابقة.

الآن، تأكدنا أن الأوامر تمثل حقا ما يقوم به البرنامج،ولكن  إذا أرجعنا السطر 22 وألغينا السطرين 20 و 21 لا نزال لا نحصل على نفس النتيجة. في الحقيقة في السطر 22 الدالة strcat تشتكي من كون العنوان p غير ممكن الوصول وترمي استثناء access violation exception.
يبدو أن هذه المشكلة تحصل بعض الأحيان في البرنامج الأصلي أيضا وبعض الأحيان لا تحصل، والحقيقة لست أدري لم يود البرنامج الوصول إلى العنوان p (ما الذي يمثله أو يؤشر إليه أصلا؟؟!).

وكما أسلف الأخ the9am3، البرنامج يلتقط صورا للنوافذ. في حالة وجد نافذة Notepad++ فإنه يلتقط صورة لنوافذها الجزئية (لست أدري بالضبط ما تعريف النافذة الجزئية) وإن لم يجد نافذة Notepad++ فإنه يلتقط صورا للنوافذ الموجودة في الجهاز.

أتوقف هنا حاليا، وأكمل لاحقا Smile
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة :
#7
(07-09-2021, 09:27 PM)the9am3 كتب : راح يعمل سكرين شوت لل taskbar و بااسم AT4RET.AT4RE اذا نفتح الملف بالhex راح انشوف هيدر BM وهذه خاصة ب bmp اذا غيرنا صيغة الملف الى bmp يكون عبارة عن صورة لل taskbar

جميل جدا...
فعلا، التحليل الحي (بالتشغيل) للتطبيق يفيد في التقاط نقط مهمة ينجزها هذا الأخير... مع وجود مخاطرة امكانية المرور بجانب جزء مهم ينفذه التطبيق في حالة تحقق شرط معين...

مثل قصة Kill Switch :
 
https://www.wired.com/2017/05/accidental-kill-switch-slowed-fridays-massive-ransomware-attack/  


 
(08-09-2021, 02:59 PM)siddigss كتب : وكما أسلف الأخ the9am3، البرنامج يلتقط صورا للنوافذ. في حالة وجد نافذة Notepad++ فإنه يلتقط صورة لنوافذها الجزئية (لست أدري بالضبط ما تعريف النافذة الجزئية) وإن لم يجد نافذة Notepad++ فإنه يلتقط صورا للنوافذ الموجودة في الجهاز.

عمل رائع اخي...
نعم، الشرط و الهدف الأساسي الذي برمج من اجله التطبيق هو محاولة التقاط صور لنوافذ البرنامج Notepad plus plus... كهدف اساسي و جعله يلتقط نوافذ اخرى كتمويه في حالة عدم توفر الشرط...
زائد على ذلك عدم حماية سير تنفيذ اوامر التطبيق لدفعه عمدا للانهيار...
(08-09-2021, 02:59 PM)siddigss كتب : يبدو أن هذه المشكلة تحصل بعض الأحيان في البرنامج الأصلي أيضا وبعض الأحيان لا تحصل، والحقيقة لست أدري لم يود البرنامج الوصول إلى العنوان p (ما الذي يمثله أو يؤشر إليه أصلا؟؟!).

من المفروض ان يكون اسم الملف الناتج الذي يحتوي الصورة الملتقطة بهذه الطريقة:
AT4RE(x).AT4RE
x هي القيمة (عنوان) التي يؤشر اليها الهندل للنافذة التي يتم التقاط جزء من صورتها...
و هذا دفع الدالة strcat الى محاولة الحصول على قيم عشوائية من عناوين في الداكرة الحية كجزء من الاسم و بما ان الدالة strcat غير محمية و مصابة بطبيعتها (لا تقوم بفحص ما تحاول الوصول اليه) فانها سوف تسبب انهيار التطبيق في حالة عدم اتاحة العنوان او عند محاولتها معالجة نوع قيم تختلف عن ما تدعمه الدالة...

من خلال هذا التطبيق، اردت ان اصلت الضوء على جزء مهم في تحليل البرمجيات اصبح مستعمل بكثر و هو تعمد كتابة شروط تؤثر بشكل مباشر في سير تنفيذ المهام التي يقوم بها تطبيق ما مع اضافة Bugs و خلل تدفع المحلل الى تجاهل تحليل التطبيق يظن انه غير مكتوب باحترافية...
أعضاء أعجبوا بهذه المشاركة :
#8
(08-09-2021, 06:06 PM)overlap كتب : من المفروض ان يكون اسم الملف الناتج الذي يحتوي الصورة الملتقطة بهذه الطريقة:
AT4RE(x).AT4RE
x هي القيمة (عنوان) التي يؤشر اليها الهندل للنافذة التي يتم التقاط جزء من صورتها...
و هذا دفع الدالة strcat الى محاولة الحصول على قيم عشوائية من عناوين في الداكرة الحية كجزء من الاسم و بما ان الدالة strcat غير محمية و مصابة بطبيعتها (لا تقوم بفحص ما تحاول الوصول اليه) فانها سوف تسبب انهيار التطبيق في حالة عدم اتاحة العنوان او عند محاولتها معالجة نوع قيم تختلف عن ما تدعمه الدالة...

هههههه حيرتني هذه، هذا ما يحصل في السطر 22 في الكود والذي بإلغائه البرنامج يعمل بشكل عادي. في الحقيقة ظننت أن هذا كان سهواً منك وأن قصدك السطرين 20 و 21 ولذا كتبتهما كتعليقين (commented out).

 
(08-09-2021, 06:06 PM)overlap كتب : من خلال هذا التطبيق، اردت ان اصلت الضوء على جزء مهم في تحليل البرمجيات اصبح مستعمل بكثر و هو تعمد كتابة شروط تؤثر بشكل مباشر في سير تنفيذ المهام التي يقوم بها تطبيق ما مع اضافة Bugs و خلل تدفع المحلل الى تجاهل تحليل التطبيق يظن انه غير مكتوب باحترافية...

ألن يؤثر هذا على عمل التطبيق وسينهار كل فترة ؟؟ أم أنها غير تجارية؟
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة : rce3033
#9
(08-09-2021, 06:45 PM)siddigss كتب : ألن يؤثر هذا على عمل التطبيق وسينهار كل فترة ؟؟ أم أنها غير تجارية؟

هدف كتابة التطبيق بهذه الطريقة هو محاولة صقل مواهب المحلل بمحاكاة حالات حقيقية في "مختبر"
و يتم استعمالها في ميدان تحليل البرامج الضارة اكثر من فرع حماية البرامج التجارية ، و تكون بالدرجة الأولى موجودة في "اول" Infector قبل تحميله بدوره لبرامج ضارة اضافية تنجز المهام الكاملة...
أعضاء أعجبوا بهذه المشاركة : siddigss , rce3033
#10
أردت أن أسألك أخي overlap، ما ال compiler الذي تستعمله؟ بعد ما كتبت الكود أعلاه لبرنامجك حاولت عمل compile له باستخدام visual studio لأتأكد أن الأسلمبي متشابهة (إلى حد ما على الأقل) ولكن visual studio يقوم بإضافة security_cookie وأشياء أخرى ولم أستطع إيقاف ال compiler من إضافتها. أيضا سؤال آخر، هل سمحت لل compiler بأن يقولم بعملية optimization؟
I am homesick for a place I have not even visited
مَا ابْيَضَّ وجهٌ باكتساب كريمةٍ ... حتى يسوِّدهُ شُحوب المَطلبِ
أعضاء أعجبوا بهذه المشاركة : rce3033


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


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