السلام علیكم ورحمة الله ،،،

من المواضیع الشیقة والمتقدمة في برمجة الأنظمة وكتابة البرامج

قد یكون العقبة في مراحل إكتشاف الثغرة وقد یكون السبب الرئیسي لإختراق الجهاز؟!

shellcode موضوع مرتبط بالمعالج والنظام ولغات البرمجة ومراقبة البرامج والتشفیر والثغرات و

SEH ألا وهو : المعالجة المنظمة للأخطاء والإستثنائات ، معروف بإختصارة

Structured Exception Handling أي

قد یعتبرة البعض موضوع معقد ؟ ولكن في هذا الموضوع ستكتشف العكس تماماً

وبعض المبرمجین یعتبرونه موضوع فرعي أو لاعلاقة لة بكتابة البرامج

وهذا هو السبب الرئیسي لكثرة الأخطاء في برامجنا

سنبدأ بمثال بسیط لكي نكتشف مامعنى المعالجة المنظمة وكیف یقوم بها النظام

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

وفي النهایة سنخترق الجهاز بواسطة ملف نصي وسنتفح منفذ للإتصال ؟!

SEH وبالتأكید عن طریق ثغرة مكتشفة في برنامج الریل بلیر ١٠ وبإستخدام

------- نبدأ -------

لو كنت متابع لمواضیع برمجة الأنظمة التي تحدثنا عنها سابقاً ، وبالتحدید برمجة أنظمة ٣٢ بت

إطلعنا على شيء جدید وهو مایعرف بالجداول مثل جداول الواصفات الشامل والواصفات المحلي....

في هذة المرحلة المتقدمة وبالتحدید في نواة نظام التشغیل یبدأ العمل؟! لتكوین جداول الإنتقال عند حدوث

خطأ

جداول الأخطاء منفصلة عن بقیة التطبیقات لكي لایحدث إنهیار للنظام بالكامل

إذا حدث خطأ كبیر

FS وهو القسم ، DS وقسم البیانات CS والدلیل على ذلك سترى إستخدام قسم جدید غیر قسم الكود

-

except و try لفهم هذة المقدمة سنبدأ بكود بسیط بلغة السي وهو عبارة عن البلوك

except إذا حدث أي خطأ ینتقل التنفیذ إلى البلوك try هذا البلوك عبارة عن تنفیذ الأوامر بداخل بلوك

لاحظ ، FS لو فكرنا كیف یتم الإنتقال بكل بساطة نقل مؤشر الإنتقال من المكدس إلى القسم

الكود

include

include

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 ولكن كما هو مستخدم في النظام والبرامج المعروفة قمنا بكتابة بلوك التحقق

قم بترجمة الكود السابق لتحصل على برنامج سنطبق علیة القسم الأول من الدرس ؟!

"....AAA " وقم بإدخال أي مدخلات ولتكن olly بعد عملیة الترجمة شغل البرنامج بواسطة

وعددها ١٠ أحرف A ملاحظة في المثال الأول ستكون المدخلات للبرنامج عبارة عن سلسلة من الحرف

وأدخل سلسلة الأحرف arguments إختر Debug طریقة الإدخال لبرامج الدوس : من خلال القائمة

إعادة تشغیل البرنامج لكي یرسل لة المدخلات الجدیدة olly وبعد ذلك سیطلب منك

كما ترى في الكود السابق strcpy والآن سنحدد نقطة توقف على المایكرو

بلغة الإسمبلي REP عبارة عن تعلیمة strcpy ملاحظة المایكرو

المهم ضع نقطة توقف على العنوان 00401066

وهو یمثل التعلیمة لنقل السلسلة النصیة إلى المكدس:

REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI

strcpy لتجد أنة توقف عند العنوان السابق وهو یمثل F بعد أن تحدد نقطة التوقف ، شغل البرنامج المراقب 9

".. AAAA" لاحظ أننا أدخلنا النص السابق

وتلاحظ أنة یتم نقل هذا النص إلى المكدس

لنرى التغیرات F بعد ذلك نستمر في التنفیذ 8

SEH هذا هو محور حدیثنا

یضع لك تلمیحات عند رقم ١ و ٢ olly وتلاحظ أن برنامج

الرقم ١ یمثل مؤشر لسجل الإستثنائات وهو عبارة عن نقل البارمترات عند حدوث خطأ

مثل قیم المسجلات وأعلام المعالج ...، وهو لیس مهم في هذا الدرس

مایهمنا هو الرقم ٢ مؤشر المعالجة ، وهو العنوان الذي سینتقل لة التنفیذ

-

بحدود ١٢٠ مرة A تلاحظ في الصورة السابقة لو قمنا بتكرار الحرف

فإننا سندخل قیمة المخزن إلى هذة العناوین ، وللتجریة

( arguments و debug أعد تطبیق الخطوة الأولى ( وهي تحدید مدخلات للبرنامج من

بحدود ١٢٠ مرة ، ثم أعد تشغیل البرنامج A وبتكرار الحرف "..AA" وقم بكتابة حرف

لترى : ، F وقم بالتنفیذ 9

strcpy سیقف التنفیذ عند النقطة التي قمنا بتحدیدها سابقاً وهي

وبالتأكید سیحدث خطأ لأننا قمنا بتمرین حجم ١٢٠ حرف إلى مخزن بحجم ١٠٠ حرف

FS خمس مرات ستجد نفسك أمام القسم الجدید ؟!! وهو F وبتكرار التنفیذ 8

، وسیتم صناعة عناوین الانتقال SEH