بسم الله الرحمن الرحيم الحمد لله رب العالمين والصلاة والسلام على أشرف المرسلين سيدنا محمد وعلى آله وصحبه ومن تبعهم بإحسان إلى يوم الدين.


حسابي في التويتر هنا


المتطلبات:

  1. خبرة بهجمات الHeap

  2. معرفة بالأساسيات الخاصة با Memory Management في C

  3. معرفة أساسيات الHeap


البداية

ماهي Poison Null Byte ؟

هي ثغرة بسيطة جداً تصير لكن تسبب خطيرة الصراحة رأيي الشخصي أشوفها من أكثر الثغرات الواقعية لأنها صعب تدقق فيها فكرتها أن يكون عندك null byte يضيفها البرنامج بعد ماتحجز chunk وتحط Data فيها يحط بعد بياناتك 0 بايت واحد مثال حجزت chunk حجمها 0x18 byte وحطيت فيها 0x18 حرف A يحط لك null byte في الأخير فا هنا حط الnull byte في size field حق الchunk الثانية يعني نقص 0x10 bytes من حجمها الأصلية و سوا clear لل prev_inuse مع الشرح رح تفهمون الثغرة

تحليل الكود البرمجي الخاص بالبرنامج

#include stdio.h #include unistd.h #include stdlib.h #include string.h int idx = 0; int size_of_table[20] = {0}; int number_of_tables = 0; int check_of_chunk[20] = {0}; char *table[20]; void alloc(); void delete(); void edit(); int get_int(); unsigned long size; void alloc(){ if(number_of_tables <= 20){ for(int i = 0;i <= 20;i++){ if(!check_of_chunk[i]){ printf("size: "); scanf("%ld",&size); size_of_table[i] = size; table[i] = (char *)malloc(size); check_of_chunk[i] = 1; printf("Created Chunk at index %d\n",i); ++number_of_tables; break; } } }else{ printf("All chunks uesd :(\n"); } } void edit(){ printf("Index: "); idx = get_int(); if(idx >= 0 || idx <= 20){ if(table[idx]){ printf("Data: "); int length=read(0,table[idx],size_of_table[idx]); table[idx][length]='\0'; }else{ printf("can't edit a free chunk\n"); } }else{ printf("Not Found The chunk\n"); } } void delete(){ printf("Index: "); idx = get_int(); if(idx >= 0 && idx <= 20){ if(table[idx]){ free(table[idx]); table[idx] = NULL; printf("The Chunk Removed Success\n"); }else{ printf("This Index is already Free`d\n"); } }else{ printf("Not Found The Index\n"); } } int get_int(){ char num[10]; int res; read(0,num,10); res = atoi(num); return res; } int main(){ setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); printf("printf: %p\n",printf); char *ptr = (char *)malloc(0x88); printf("heap: %p\n",ptr-16); free(ptr); while(1){ int cho; printf("\n1- Alloc\n2- Edit\n3- Free\n\n> "); cho = get_int(); switch (cho){ case 1: alloc(); break; case 2: edit(); break; case 3: delete(); break; default: printf("Invaild Choice\n"); } }}

نشوف ان البرنامج عنده 3 functions رئيسية راح نحلل كل وحدة لين نلقى الثغرة

تحليل alloc() function

نشوف أول function وظيفتها تحجز لك chunk في الheap تطلب منك فقط إدخال حجم الخاص بالchunk الي تبيها ويمديك تسوي 20 chunk فقط.

تحليل edit() function

نشوف ثاني function موجودة عندنا تطلب منك إدخال رقم الchunk التي تريد إضافة بيانات فيها وتتأكد اذا كانت الchunk موجودة او لا وأذا كانت موجودة تأخذ منك البيانات التي تريد وضعها وتأخذ حجم البيانات وتضع 0\ في النهاية وهنا الثغرة فا اذا كانت حجم الchunk 0x18 والبيانات التي أدخلتها 0x18 حرف A ثم تضع بعد 0x18 بايت null byte وهنا تؤثر على الchunk الثانيه التي بعد الchunk الأولى لقد قلت لكم أنها ثغرة بسيطة جداً لكن خطيرة وحلها بسيط جداً.

table[idx][length-1]='\0';

هذا هو الحل فقط يضع 0x0 في الحرف رقم 0x18 وليس بعد ال0x18 لا فقط يحذف أخر حرف كتبته ويضع بداله 0x0.

تحليل delete() function

نشوف أخر function موجودة تطلب من المستخدم إدخال رقم الchunk التي يريد تحريرها وتتأكد اذا كانت موجودة او لا وأن كانت موجودة تحررها وتحذف البيانات التي بداخلها لاتوجد ثغرة هنا.

Join