[للامانة تم اقتباس بعض الاشياء من موضوع للاخ JASS وواحد نسيت اسمه من منتدى arabteam2000 + مدونة علي عبدالغني + مصادر اجنبية]
اعتقد ان الاغلب قد سمع بهذه الثغرة و التي قد تم اختراق الكثير من السيرفرات عبرها
فهذه لا تتطلب مطلقا اي تغيير في كود البرنامج او تحميله في المنقح لاننا سناثر على عمله عبر استغلاننا "ثغرة" تسمح لنا بكتابة shell code عبره
اول ظهور لها كان عام 1988
كانت تدعى the Morris Internet worm او ربما دودة الانترنت او ماشابه
ومثل هذه الهجمات يمكن استخدامها local اي محلي تؤثر على عمل برنامج او على خادمات المواقع وتعرف باسم "هجمات الحرمان من الخدمات" أو يمكن استعمالها في اختراق الخادم بشكل كامل ومع صلاحيات قد تصل
إلى root أحيانا وهذا النوع من الثغرات يعد الأخطر على الإطلاق وحتى الآن لا يوجد لها حل فعال بل فقط يتم الانتباه من الوقوع فيها من قبل المبرمجين.
يحدث عندما تتجاوز سعة المكدس ويطلب المزيد من الذاكرة
ولمن لا يعرف جيدا Stack او المكدس
ال stack : عبارة عن مكان في الذاكرة RAM يستخدمه المبرمج للتخزين
المؤقت او عند استدعاء دالة معينة يمكن تمرير البارمترات للدالة عن طريق
المكدس. كما ان البرنامج نفسه يستخدمه مثلا عندما يصل المعالج
الى امر قطع interrupt المعالج يقوم بتخزين الرايات flags ومؤشر الاوامر IP عنوان الرجوع وايضا قبل استدعاء
دالة معينة يجب تخزين عنوان الرجوع في المكدس حتى يستطيع المعالج الرجوع الى الامر التالي
فمثلا عند كتابتك اي دالة ك puts() , gets() , printf() وتمرر لها بارامترات يتم تخزين البارامترات في المكدس
و
يعتمد حجم المكدس على امور عدة منها
-نظام التشغيل
– ذاكرة الكمبيوتر
– لغة البرمجة المستخدمة في كتابة البرنامج
– طراز المعالج
________________________
نعود للموضوع
ويحدث التاثير عند الكتابة فوق الذاكرة "يتم الكتابة فوق الذاكرة بتلك البيانات التي طلب المكدس لها مكان في الذاكرة "
(لا تقلق ستفهم مع المثال التطبيقي)
طبعاؤ هناك انواع مختلفة ل buffer overflow
stack, heap, format, integer, and 0-day
بهذا الموضوع سنتكلم عن stack overflow
1- Infinite recursion
وهي استدعاء الدالة لنفسها الي ما لا نهاية
مما يؤدي الي استهلاك حجم المكدس
هذا مثال بلغة سي لهذه المشكلة
هذه الدالة تقوم باستدعاء نفسها و الدوال التي يتم استدعاءها تقوم ب استدعاء نفسها ايضاً من ما يؤدي الي فيض في المكدس
2- Very deep recursion
وهي دالة تستدعي نفسها ولكن تتوقف بحدوث شرط ما
هذا النوع من الدوال قد يحدث في بعض الاحيان فيض في المكدس لأن من الصعب ايقاف الدالة ف عندما يقوم النظام ب ايقاف دالة تستدعي الدالة المستدعات دالة اخرى
و هذا مثال بلغة سي لكود قد يسبب مشكلة
يفضل استخدام الحلقة بدلً من ذلك الكود
لكي لا تحدث مشاكل
و من اسباب حدوث علة stack overflow هو تعريف متغيرات كبيرة الحجم خارج قابلية المكدس( تعريف مصفوفة بحجم كبير)
لهذا ينصح الكثير من المبرمجين بستخدام الذاكرة الديناميكية
مثال لمتغير كبير الحجم بلغة سي
هذا ربما من ابسط الطرق لعمل overflow
كود بسيط جدا في السي
كما ترى فها قمنا بتعريف مصفوفة var[10] وقد خزنا فيها النص الذي يحتاج لمصفوفة اكبر
مما ادى الى فيضان المكدس
حمل الملف في olly
and braeakpoint 401543
و اعمل run ليتوقف
وستلاخظ عنوان الرجوع في المكدس
و ما الذي سيحدث بعدها !
حسنا تابع وتخطى تعليمةRET
كما عنوان الرجوع (وهو العنوان التعليمة الذي بعد CALL لهذه الدالة) قد تم الكتابة عليه
بعدها انظر لمسجل التعليمات EIP = 4C4C4C4C
=ASCI LLLL
حسنا ماذا لو استبدلنا ال LLLL بعنوان تعليمة ما ثم بعدها وضعنا ال ٍshellcode
بالتاكيد ممكن
وهذا سيكون على myexpo الذي ستجده في المرفقات
يجب ان تنشئ info.txt لانه فقط يقرا الملف الذي اسمه هكذا
بعدها اكتب الاحرف من A to Z لكي تعرف من اين يبدا بكتابة العنوان
ستجد انه يبدأ من اخر اربع حروف قبل ال Q كما ادخلت انا ABCDEFGHIJKLMNOPQRSTUVWXYZ
حسنا الان افتح HEX editor انا استعمل HxD.exe
فرضا اننا نريد ان ننقله الى العنوان
004014ِ8E
غير كما يلي من خلال قسم الهكس وليس الاسكي
فمثلا البي يقابلها 50 غير كما يلي
الذي يقابل P ب 00
الذي يقابل O ب 40
الذي يقابل N ب 14
الذي يقابل Mب 8E
و ثم حمل القارء ب ollydbg
then
ضع نقطة توقف كما في الصورة
حيث دالة ReadFile )RFile(
ثم سترى المسجل التعليمات اشار الى التعليمة التي نريدها اي ذلك العنوان
كما تلاحظ بالصورة فقد انتقل مسجل التعليمات ليشير الى تلك التعليمة و اظنك ستلاحظ ان المؤشر ESP شير الى ما بعد P و هناك بامكاننا نضع ال shellcode
هذا مثال
"\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";
طبعا كما ترى بدايته 90 والتي تعني nop
طبعا يجب ان اردت كتابته يجب ان تكتبه بدون "x\ ويجب تحويله لاسكي
كما وضحت كل هذا بملف txt بالمرفقات
المرفقات مهمة جدا
بها امثلة عملية
كما وصعت كتاب يشرح ذلك به مثال
طبعا عند التطفل لجهاز عبر هذه الثغرة يكتب سكريبت ارسال/استقبال بالبايثون كما تم توضيح هذا في الكتاب و تستطيع استعمال اداة Metasploit المشهورة
رابط المرفقات :
https://1drv.ms/u/s!AgqexnHLomZ0b97sCCHA...o?e=5Iflgj
كتاب مفيد يشرح Buffer Overflow و كتابة shellcode for windows من بعد الصفحة 317 لمن يعرف الأساسيات
http://index-of.es/Varios/Securite/BoF_Attacks.pdf
اعتقد ان الاغلب قد سمع بهذه الثغرة و التي قد تم اختراق الكثير من السيرفرات عبرها
فهذه لا تتطلب مطلقا اي تغيير في كود البرنامج او تحميله في المنقح لاننا سناثر على عمله عبر استغلاننا "ثغرة" تسمح لنا بكتابة shell code عبره
اول ظهور لها كان عام 1988
كانت تدعى the Morris Internet worm او ربما دودة الانترنت او ماشابه
ومثل هذه الهجمات يمكن استخدامها local اي محلي تؤثر على عمل برنامج او على خادمات المواقع وتعرف باسم "هجمات الحرمان من الخدمات" أو يمكن استعمالها في اختراق الخادم بشكل كامل ومع صلاحيات قد تصل
إلى root أحيانا وهذا النوع من الثغرات يعد الأخطر على الإطلاق وحتى الآن لا يوجد لها حل فعال بل فقط يتم الانتباه من الوقوع فيها من قبل المبرمجين.
يحدث عندما تتجاوز سعة المكدس ويطلب المزيد من الذاكرة
ولمن لا يعرف جيدا Stack او المكدس
ال stack : عبارة عن مكان في الذاكرة RAM يستخدمه المبرمج للتخزين
المؤقت او عند استدعاء دالة معينة يمكن تمرير البارمترات للدالة عن طريق
المكدس. كما ان البرنامج نفسه يستخدمه مثلا عندما يصل المعالج
الى امر قطع interrupt المعالج يقوم بتخزين الرايات flags ومؤشر الاوامر IP عنوان الرجوع وايضا قبل استدعاء
دالة معينة يجب تخزين عنوان الرجوع في المكدس حتى يستطيع المعالج الرجوع الى الامر التالي
فمثلا عند كتابتك اي دالة ك puts() , gets() , printf() وتمرر لها بارامترات يتم تخزين البارامترات في المكدس
و
يعتمد حجم المكدس على امور عدة منها
-نظام التشغيل
– ذاكرة الكمبيوتر
– لغة البرمجة المستخدمة في كتابة البرنامج
– طراز المعالج
________________________
نعود للموضوع
ويحدث التاثير عند الكتابة فوق الذاكرة "يتم الكتابة فوق الذاكرة بتلك البيانات التي طلب المكدس لها مكان في الذاكرة "
(لا تقلق ستفهم مع المثال التطبيقي)
طبعاؤ هناك انواع مختلفة ل buffer overflow
stack, heap, format, integer, and 0-day
بهذا الموضوع سنتكلم عن stack overflow
1- Infinite recursion
وهي استدعاء الدالة لنفسها الي ما لا نهاية
مما يؤدي الي استهلاك حجم المكدس
هذا مثال بلغة سي لهذه المشكلة
int foo()
{
return foo();
}
هذه الدالة تقوم باستدعاء نفسها و الدوال التي يتم استدعاءها تقوم ب استدعاء نفسها ايضاً من ما يؤدي الي فيض في المكدس
2- Very deep recursion
وهي دالة تستدعي نفسها ولكن تتوقف بحدوث شرط ما
هذا النوع من الدوال قد يحدث في بعض الاحيان فيض في المكدس لأن من الصعب ايقاف الدالة ف عندما يقوم النظام ب ايقاف دالة تستدعي الدالة المستدعات دالة اخرى
و هذا مثال بلغة سي لكود قد يسبب مشكلة
void function (argument)
{
if (condition)
function (argument);
}
يفضل استخدام الحلقة بدلً من ذلك الكود
لكي لا تحدث مشاكل
و من اسباب حدوث علة stack overflow هو تعريف متغيرات كبيرة الحجم خارج قابلية المكدس( تعريف مصفوفة بحجم كبير)
لهذا ينصح الكثير من المبرمجين بستخدام الذاكرة الديناميكية
مثال لمتغير كبير الحجم بلغة سي
int foo()
{
double x[1000000];
}
مثال بسيط جداهذا ربما من ابسط الطرق لعمل overflow
كود بسيط جدا في السي
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char var[10];
strcpy( var, "AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHJJJJJJJLLLLLMMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ\n" );
printf( var );
return 0;
}
كما ترى فها قمنا بتعريف مصفوفة var[10] وقد خزنا فيها النص الذي يحتاج لمصفوفة اكبر
مما ادى الى فيضان المكدس
حمل الملف في olly
and braeakpoint 401543
و اعمل run ليتوقف
وستلاخظ عنوان الرجوع في المكدس
و ما الذي سيحدث بعدها !
حسنا تابع وتخطى تعليمةRET
كما عنوان الرجوع (وهو العنوان التعليمة الذي بعد CALL لهذه الدالة) قد تم الكتابة عليه
بعدها انظر لمسجل التعليمات EIP = 4C4C4C4C
=ASCI LLLL
حسنا ماذا لو استبدلنا ال LLLL بعنوان تعليمة ما ثم بعدها وضعنا ال ٍshellcode
بالتاكيد ممكن
وهذا سيكون على myexpo الذي ستجده في المرفقات
يجب ان تنشئ info.txt لانه فقط يقرا الملف الذي اسمه هكذا
بعدها اكتب الاحرف من A to Z لكي تعرف من اين يبدا بكتابة العنوان
ستجد انه يبدأ من اخر اربع حروف قبل ال Q كما ادخلت انا ABCDEFGHIJKLMNOPQRSTUVWXYZ
حسنا الان افتح HEX editor انا استعمل HxD.exe
فرضا اننا نريد ان ننقله الى العنوان
004014ِ8E
غير كما يلي من خلال قسم الهكس وليس الاسكي
فمثلا البي يقابلها 50 غير كما يلي
الذي يقابل P ب 00
الذي يقابل O ب 40
الذي يقابل N ب 14
الذي يقابل Mب 8E
و ثم حمل القارء ب ollydbg
then
ضع نقطة توقف كما في الصورة
حيث دالة ReadFile )RFile(
ثم سترى المسجل التعليمات اشار الى التعليمة التي نريدها اي ذلك العنوان
كما تلاحظ بالصورة فقد انتقل مسجل التعليمات ليشير الى تلك التعليمة و اظنك ستلاحظ ان المؤشر ESP شير الى ما بعد P و هناك بامكاننا نضع ال shellcode
هذا مثال
"\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";
طبعا كما ترى بدايته 90 والتي تعني nop
طبعا يجب ان اردت كتابته يجب ان تكتبه بدون "x\ ويجب تحويله لاسكي
كما وضحت كل هذا بملف txt بالمرفقات
المرفقات مهمة جدا
بها امثلة عملية
كما وصعت كتاب يشرح ذلك به مثال
طبعا عند التطفل لجهاز عبر هذه الثغرة يكتب سكريبت ارسال/استقبال بالبايثون كما تم توضيح هذا في الكتاب و تستطيع استعمال اداة Metasploit المشهورة
رابط المرفقات :
https://1drv.ms/u/s!AgqexnHLomZ0b97sCCHA...o?e=5Iflgj
كتاب مفيد يشرح Buffer Overflow و كتابة shellcode for windows من بعد الصفحة 317 لمن يعرف الأساسيات
http://index-of.es/Varios/Securite/BoF_Attacks.pdf