السلام عليكم...
وطريقه استغلالها بشكل متطور format string بتكلم اليوم عن ثغرات
printf ثغرات الفورمات سترينق تكون في دوال
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf
المستخدم في داله stringوهي عباره عن غلطات او هفوات المبرمجين , عند استخدامهم لهذي الدوال من غير تعريف ال
بالفورمات باراميتر printf
هناك انواع كثيره من الفورمات باراميترز مثل:
الي بيهمنا هو القرائه والكتابه على الميموري.
نجيب كود مضروب ونشرح عليه احسن
وطريقه استغلالها بشكل متطور format string بتكلم اليوم عن ثغرات
printf ثغرات الفورمات سترينق تكون في دوال
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf
المستخدم في داله stringوهي عباره عن غلطات او هفوات المبرمجين , عند استخدامهم لهذي الدوال من غير تعريف ال
بالفورمات باراميتر printf
هناك انواع كثيره من الفورمات باراميترز مثل:
unsigned hexadecimal للقرائه من الميموري بصيغة x%
decimal للقرائه من الميموري بصيغة d%
unsigned decimal للقرائه من الميموري بصيغة %u
سترينق %s
للكتابه على الميموري n%
لكتابة 16 بت على الميموري بدلا من 32 بت hn%
decimal للقرائه من الميموري بصيغة d%
unsigned decimal للقرائه من الميموري بصيغة %u
سترينق %s
للكتابه على الميموري n%
لكتابة 16 بت على الميموري بدلا من 32 بت hn%
الي بيهمنا هو القرائه والكتابه على الميموري.
نجيب كود مضروب ونشرح عليه احسن
#include <%stdio.h%>
#include <%string.h%>
int main(int argc, char **argv) {
char buf[1024];
strncpy(buf, argv[1], sizeof(buf) - 1);
printf(buf);
return 0;
}
استخدمت بدون تحديد الفورمات باراميتر فيها printf مثل ماشايفين, الداله
في المدخلات %x نقدر نقرا بيانات من الميموري اذا استخدمنا
مثلا
مثل ما نشوف طلعنا قيم من الميموري بصيغة الهيكس ديسمل.
الحين المطلوب منا ان نكتب الشل كود على الميموري, ونكتب عنوان الشل كود على عنوان من عناوين مسجلات الميموري, في موضوعنا eip السابق عن ثغرات فيض المكدس شرحنا كيف نكتب عنوان الشل كود على مسجل
.dtors هذي المره بنشرح كيف نكتب عنوان الشل كود على عنوان
كومبايلرز GNU الي هو عباره عن مسجل خاص ياتي مع
يشتغل بعد ما يبدا البرنامج بالعمل يعني بعد ما تشتغل الداله .dtors وعنوان
وهو ينظاف على البرنامج بشكل تلقائي بعد ما تعمل له كومبايل بال, main()
يعني لو كتبنا على عنوان ,gcc
عنوان الشل كود لنا بيشتغل الشل كود قبل ما ينهي البرنامج عمله, حلو هذا المطلوب dtor
ممكن نطلعه بطريقتين .dtors اول شي بنطلع عناوين
مثل ما تشوفون عنوان objdump الاولى عن طريق
هو08049510 dtor
بتشوفون عندنا عنوانين الاول بدايه ,nm الثانيه عن طريق
و الثاني نهايته الي هو يزيد عن البدايه باربع بايتات dtor
يعني على 08049514 dtors نحن نبغي نكتب على نهاية
نبغي نكتب الشل كود على الميموري ونبغي نعرف عنوانه dtors الحين بعد ما طلعنا عنوان
env بنكتب الشل كود على
فاللينكس, ما تهمنا الطريقه الي نكتب فيها الشل كود على الميموري, المهم انه ينكتب وبس
SHELLCODE بنعرف الشل كود على الاينفايرومنت باسم
env نتاكد ان الشل كود انكتب على
تمام امورنا طيبه, الحين نبغي نعرف عنوان الشل كود, ممكن ان نعملها بالطريقه الكلاسيكيه عن طريق
والبحث عن عناوين النوب gdb
مثل ما شايفين شغلنا البرنامج المصاب بالديباقر, وبعدين عملنا
*main في بداية البرنامج عند break point
runوبعدين شغلنا البرنامج
وتصفحنا الميموري , وحصلنا قيم النوب والشل كود بعدها.
وخلاص بيشتغل الشل كود dtor نقدر ناخذ اي عنوان من عناوين النوب هذي ونكتبه على عنوان
ههههههههههههه لا صبرو الموضوع بعده شويه مطول في كمن شغله نحتاج نسويها قبل.
اوكيه هذي الطريقه الكلاسيكيه لايجاد عنوان الشل كود, نقدر بعد نستخدم طريقه ثانيه اسهل, وهي عن طريق استخدام داله في لغه السي getenv()اسمها
هذا البرنامج الصغير بيعطينا عنوان الشل كود مباشره
#include <%stdio.h%>
int main() {
printf("%p",getenv("SHELLCODE"));
return 0; }
البرنامج عطانا العنوان
0xbfffde7a
كان كاتب برنامج خاص يحتوي على عدد من الشل كودز لانطمه مختلفه Qnix أخوي
يقوم بحقن الشل كود في الانفايرومنت ويطعيك عنوانه مباشره
http://www.0x80.org/code/app/envt/envt.c
الحين نبغي نكتب ,dtors الحين حصلنا على عنوان الشل كود وعنوان ال
0xbfffde7a
على
0x08049514
0 الى 32 بت وتحويله الى ديسملxbfffde7a بس اول شي بنحتاج نقسم العنوان
%n علشان نقدر نكتبه بالفورمات باراميتر
بنحول قيم الهيكس الى ديسمل ASCII table باستخدام
http://www.asciitable.com/
او ممكن تستخدمون ادات التحويل من هيكس الى ديسمل
http://drdeath.myftp.org:881/crypt.php ;)
bf = 191
ff = 255
de = 222
7a = 122
الحين بنقوم بعمليه حسابيه بسيطه, بنطرح كل قيمه من القيمه الي تحتها. بس اذا كانت القيمه الاولى اصغر من الثانيه بنضيف لها عدد 256 (roll over) وبعدين بنقوم بالطرح الي تسمى بعملية
dtors الحين هذا القيم بنكتبها على اربع عناوين من عناوين
نحن عندنا العنوان
0 بنزيد عليه بعد 3 عناوين بعده, يعني بيكون كالتاليx08049514
الحين بنحتاج نعرف كم فورمات باراميتر بنحتاج علشان نوصل لعنوان المدخل الي بنكتبه
%x مثل ماتشوفون بعد حوالي اربع
AAAA وجدنا مكان مدخلنا الي هو
والي يقابله 41414141
ممكن انك تروح مباشره وتستعرض قيمة الخانه الرابعه بهذا الشكل
بنكتب عناوين AAAA تمام, الحين بنعوض بدل
الاربعه الي عندنا, يعني بتنكتب عناوين الديتورز على هذي الاماكن من الميموري dtors
وبالتالي على هذي الخانات بنروح وبنكتب عنوان الشل كود لنا, الي نحنا حولناه الى صيغه ديسمل 23 بت
سنقوم بكتابة قيم الديسمل التي هي في الحقيقه عنوان الشل كود داخل عناوين الديتور.
%x او %u و %nبنستخدم
الاستغلال سيكون بالشكل التالي
opcode بصيغه dtorلكتاتب عناوين ال printf مثل ما شايفين, استخدمنا
(little endianا (بطريقه عكسيه وفقا لبروسيسرات ال
لكتابت قيم الديسمل على الاماكن الي حددناها الي هي تبدأ من 4 الى 7 %x و %n وبعدها استخدمنا الفورمات سترينق
واشتغل معانا الشل وحصلنا على صلاحيات يوزر اخر الرووت حيث ان الملف المضروب يملك صلاحيات
لليوزر رووت guid
ممكن ايضا كتابت عنوان الشل كود على الديتور بصيغة ديسمل ولكن على شكل 16 بت , بدلا من 32 بت
عنوان الشل كود الي هو
0xbfffde7a
بنقسمه الى قسمين فقط بدل الاربع اقسام, وبنحوله الى ديسمل , النصف الاول بنطرحه من 8 والثاني بنطرحه من الاول. نطبق ونشوف
الاستغلال بيكون نفس الاستغلال الي كتبناه قبل بس بدل
%hn بنستخدم %n
لكن عناوين الديتور بتكون فقط عنوانين
0x08049514 الاول بيكون
0x08049514+2 والثاني بيكون
0x08049516 الي هو بيكون
الاستغلال بيكون بهذا الشكل
مثل ماشايفين ,اكتبنا قيم 16 بت ديسمل على قيم الديتور في العنوانين المحليين
\$hnو %5 \$hn4%
تعطي نفس الناتج ما تفرق %u استخدمنا %x وبدل
واستخدمت
ماتفرق كلهم يعطون نفس النتيجه printf في الاستغلال بدل perl
اتمنى ان يكون الموضوع مفيد , واي استفسار انا حاظر.
تقبلو تحياتي..
Dr.Death