السلام عليكم ورحمة الله ,,,
من المواضيع الشيقة والمتقدمة في برمجة الأنظمة وكتابة البرامج ؟!
قد يكون العقبة في مراحل إكتشاف الثغرة وقد يكون السبب الرئيسي لإختراق الجهاز؟!
موضوع مرتبط بالمعالج والنظام ولغات البرمجة ومراقبة البرامج والتشفير والثغرات وshellcode
ألا وهو : المعالجة المنظمة للأخطاء والإستثنائات , معروف بإختصارة SEH
أي Structured Exception Handling
قد يعتبرة البعض موضوع معقد ؟ ولكن في هذا الموضوع ستكتشف العكس تماماً
وبعض المبرمجين يعتبرونه موضوع فرعي أو لاعلاقة لة بكتابة البرامج
وهذا هو السبب الرئيسي لكثرة الأخطاء في برامجنا
سنبدأ بمثال بسيط لكي نكتشف مامعنى المعالجة المنظمة وكيف يقوم بها النظام
وبعد ذلك سترى الدعم المحترم الذي يقدمة برنامج olly في هذا المجال وتبسيطة لآخر درجة
وفي النهاية سنخترق الجهاز بواسطة ملف نصي وسنتفح منفذ للإتصال ؟!
وبالتأكيد عن طريق ثغرة مكتشفة في برنامج الريل بلير 10 وبإستخدام SEH
------- نبدأ -------
لو كنت متابع لمواضيع برمجة الأنظمة التي تحدثنا عنها سابقاً , وبالتحديد برمجة أنظمة 32 بت
إطلعنا على شيء جديد وهو مايعرف بالجداول مثل جداول الواصفات الشامل والواصفات المحلي....
في هذة المرحلة المتقدمة وبالتحديد في نواة نظام التشغيل يبدأ العمل؟! لتكوين جداول الإنتقال عند حدوث خطأ
جداول الأخطاء منفصلة عن بقية التطبيقات لكي لايحدث إنهيار للنظام بالكامل إذا حدث خطأ كبير
والدليل على ذلك سترى إستخدام قسم جديد غير قسم الكودCS وقسم البياناتDS , وهو القسم FS
-
لفهم هذة المقدمة سنبدأ بكود بسيط بلغة السي وهو عبارة عن البلوك try و except
هذا البلوك عبارة عن تنفيذ الأوامر بداخل بلوك try إذا حدث أي خطأ ينتقل التنفيذ إلى البلوك except
لو فكرنا كيف يتم الإنتقال بكل بساطة نقل مؤشر الإنتقال من المكدس إلى القسم FS , لاحظ
الكود:
#include<stdio.h>
#include<string.h>
int ExceptionHandler(void);
int main(int argc,char *argv[]){
char temp[100];
if (argc != 2)
return 1;
__try {
strcpy(temp,argv[1]);
printf(temp);
} __except ( ExceptionHandler() ){}
return 0;
}
int ExceptionHandler(void){
printf("Exception");
return 0;
}هذا البرنامج عبارة عن واجهة دوس يقوم بإستقبال المدخلات من المستخدم وعرضها
ولكن كما هو مستخدم في النظام والبرامج المعروفة قمنا بكتابة بلوك التحقق try
قم بترجمة الكود السابق لتحصل على برنامج سنطبق علية القسم الأول من الدرس ؟!
بعد عملية الترجمة شغل البرنامج بواسطة olly وقم بإدخال أي مدخلات ولتكن" AAA...."
ملاحظة في المثال الأول ستكون المدخلات للبرنامج عبارة عن سلسلة من الحرف A وعددها 10 أحرف
طريقة الإدخال لبرامج الدوس : من خلال القائمة Debug إختر arguments وأدخل سلسلة الأحرف
وبعد ذلك سيطلب منك olly إعادة تشغيل البرنامج لكي يرسل لة المدخلات الجديدة
والآن سنحدد نقطة توقف على المايكرو strcpy كما ترى في الكود السابق
ملاحظة المايكرو strcpy عبارة عن تعليمة REP بلغة الإسمبلي
المهم ضع نقطة توقف على العنوان hex :00401057
وهو يمثل التعليمة لنقل السلسلة النصية إلى المكدس:
REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
بعد أن تحدد نقطة التوقف , شغل البرنامج المراقب F9 لتجد أنة توقف عند العنوان السابق وهو يمثل strcpy
كما هو موضح:

لاحظ أننا أدخلنا النص السابق "AAAA .."
وتلاحظ أنة يتم نقل هذا النص إلى المكدس
بعد ذلك نستمر في التنفيذ F8 لنرى التغيرات

هذا هو محور حديثنا SEH
وتلاحظ أن برنامج olly يضع لك تلميحات عند رقم 1 و 2
الرقم 1 يمثل مؤشر لسجل الإستثنائات وهو عبارة عن نقل البارمترات عند حدوث خطأ
مثل قيم المسجلات وأعلام المعالج ..., وهو ليس مهم في هذا الدرس
مايهمنا هو الرقم 2 مؤشر المعالجة , وهو العنوان الذي سينتقل لة التنفيذ
-
تلاحظ في الصورة السابقة لو قمنا بتكرار الحرف A بحدود 120 مرة
فإننا سندخل قيمة المخزن إلى هذة العناوين , وللتجرية
أعد تطبيق الخطوة الأولى ( وهي تحديد مدخلات للبرنامج من debug و arguments )
وقم بكتابة حرف "AA.." وبتكرار الحرف A بحدود 120 مرة , ثم أعد تشغيل البرنامج
وقم بالتنفيذ F9 , لترى :
سيقف التنفيذ عند النقطة التي قمنا بتحديدها سابقاً وهي strcpy
وبالتأكيد سيحدث خطأ لأننا قمنا بتمرين حجم 120 حرف إلى مخزن بحجم 100 حرف
وبتكرار التنفيذ F8 خمس مرات ستجد نفسك أمام القسم الجديد ؟!! وهو FS
وسيتم صناعة عناوين الإنتقال SEH , كما ترى

-
لو إستمرينا بتكرار التنفيذ سيتم الإنتقال للعنوان 41414141
مايهمنا من هذة النقطة أننا وجدنا طريقة أخرى وهي مؤشر SEH
وتلاحظ في المكدس عنوان آخر للعودة ؟ ولو قمنا بتكرار الحرف 140 مرة
فإننا سنغير في عنوان العودة , وهنا وجدنا الطريقة الثانية للتغيير
ماهي العلاقة بين الطريقة الأولى والثانية ؟ الإجابة هي بقية الدرس...
-
ملاحظة ماسبق من الأمثلة المقصود منها التعرف على عناوين SEH بشكل مفصل
ولكن مع بقية الأمثلة والدروس لن نحتاج كل هذة الخطوات لأن olly يفي بالغرض
لاحظ الأمر في القائمة View تجد الأمر SEH chain
ولإستخدام هذا الأمر بشكل سريع , أعد تشغيل البرنامج
ولاحظ محتوى SEH قبل تنفيذ تعليمة strcpy وبعد التعليمة ؟!
ولاحظ التغيير:

هذة العناوين التي نحتاجها للدخول في الموضوع
وبالتأكيد بعد هذة المقدمة عرفنا كيف ظهرت وكيف تغيرت ؟!
-
وبعد الدراسة النظرية والأمثلة الوهمية ,,,,تـــــــــابع
لترى وتطبق أمثلة حقيقية , وأخطاء في برامج عالمية
-
تابع 2



