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

سؤال حول Shell Code

بدأه aziz nor في 1 يونيو 2009 · 19 رد · 2,128 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي بعض التساؤلات وهي حول موضوع قدمه الاخ

jass

حول البرمجة المتقدمة للملفات التنفدية

وقد دكر في جزئية هدا اقتباسها

اقتباس
الخطوة الأولى تحديد عناون الكود التنفيذي في الذاكرة؟

هذة الخطوة مهمة ,,كيف سنعرف مكان وعنوان تنفيذ برنامجنا بداخل أي عملية

لكي نبدأ بتكوين بيئة للملف التنفيذي , الحل بسيط عن طريق قانون أبسط

قانون تعليمة JMP و CALL

أنا متأكد أن أغلبكم تتبع وراقب طريقة عمل فايروس أو shellcode

وقد تستغرب من أن هذا الشل كود يبدأ بعشرات JMP و Call دون أي تنفيذ ودون سبب واضح؟!

وللمعلومة : فايروس ساسر يبدأ ب 20 تعليمة jmp .. تقريباً

هذة الطريقة لتحديد عناوين الكود بداخل أي عملية .... كيف ؟

أولاً : تعليمة JMP و Call لهما نفس العمل وقد لايكون هنالك إختلاف , إلى في العمل الإضافي للمعالج

عندما ينفذ المعالج تعليمة jmp فإنة ينقل التنفيذ فقط , ولكن عندما ينفذ تعليمة call

فإن المعالج ينقل التنفيذ + يقوم بتخزين عنوان الرجوع للتعليمة التالية , وهنا وجد الحل

الآن نريد تحديد أي عنوان بالبايت داخل برنامجنا , نبدأ بتعليمة jmp وننقل التنفيذ

إلى العنوان الذي نريد معرفته , بعد ذلك ننفذ تعليمة call , مباشرة يقوم المعالج بشكل

تلقائي بدفع عنوان العودة إلى المكدس بواسطة الأمر push

نحن نقوم بكل بساطة بسحب عنوان العودة بتعليمة pop إلى أي مسجل وبهذا نكون قد حددنا موقعنا

--- وهذا هو الشكل النهائي للقانون ----

0012FE1C: JMP SHORT 0012FE1F
0012FE1E: NOP
0012FE1F: CALL 0012FE62
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
0012FE62: POP EDI

فسؤال هو كتالي

مادا يقصد بالعنوان المراد البحث عنه هل هو هنوان بداية برنامجنا

point entry

ام هو عنوان بداية مقطع الكود في برنامجنا الاصلي

يعني لم افهم المراد بالعنوان هدا

ثانيا

دكر انك هنالك قانون واستعمل قيم هل ثابتة ام هو مثال فقط

فارجو من الاخوة الافادة بشرح لهده الجزئية وشكرا

تم تعديل هذه المشاركة بواسطة aziz nor في 1 يونيو 2009 في 19:38

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#2

المقصود بعد قراءة الكود هو معرفة عنوان برنامج فى الذاكرة وذلك حسب عمل المعالج الذى يقوم بتخزين عنوان الرجوع من التعليمة والذى يتم سحبة بعد تعليمة return وهذا لمعرفة عنوان برنامج الحقيقى حيث العناوين التى تستخدمها فى البرمجة يتم استبدالها مع كل مرة يتم فيها تحميل البرنامج فى الذاكرة

هذا ما فهمته من الكود لعل الاخوة هنا لهم رأى اخر

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#3

- عند تنفيذ الشل كود فأين يتم حقنه ؟

في المكدس .

- كيف تعرف عنوان الجزء الذي تم حقن الكود فيه من المكدس ؟

عن طريق استخدام call/pop :

L14 : call L15
L15 : pop eax
now eax = address of L15

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

السلام عليكم

شكرا للاخوة علي الرد

لكن براحة علي شوي

لان فهمي بطيئ شوي

انا اشكاليتي في نفطة البداية لمادا

نبحث عن عنوان تنفيد الشكل كود

????

يعني هل هدا يطابق عملنا في ثغرات

buffer over flow

في ايجاد عنوان العودة من اجل نقل التحكم للشل مود الخاص بنا

يعني ان هده طريق من طرق ايجاد بداية الشكل كود ام انا غلطان

اما بنسبة للكود هدا فهو لي محيرني

L14 :call L15
L15 : pop eax

انا اعرف انه عند استدعاء دالة يتم الدفع

بعنوان العودة الي المدكس

ونستطيع الحصول عليه

بتعليمة

pop

لكن

الدالة المقابلة ل

L15

مادا ستكون هل دالة وفقط ام دالة محددة

ارجو ان تتحملوا اسئلتي

وشكرا

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#5

عند تنفيذ التعليمة call يتم دفع قيمة العودة الى المكدس وهي العنوان الذي يلي التعليمة call مباشرة ، يعني لو call توجد عند العنوان 0x12005 و طول الـopcode للتعليمة call مثلا 5 بايت اذن عنوان العودة الذي سيتم دفعه هو 0x1200a .

الآن بعد تنفيذ التعليمة call مباشرة نقوم بسحب عنوان العودة الذي تم تخزينه في المكدس عن طريق التعليمة pop في احد المسجلات .

يتم استخدام هذا العنوان لمعرفة عنوان البداية للشل كود وذلك بغرض معرفة عناوين فرعية داخل الشل عن طريق الازاحة مثل عناوين نصوص معينة داخل الشل وهكذا .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

اه يا عالم يا مخربة

احنا بنستخدم العناوين فى اشياء اخرى :D

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#7

السلام عليكم

شكرا شباب علي الردرود

لكن مازال عندي لبس والظاهر اني

مخربط مابين عناوين الاستفادة من الثغرات وعنواين كتابة شل كود

وحصيغ السؤال بطريقة اخري ويرب اكون قربت الصورة

التعليمات دي انا فاهم معنا البرمجي جيد من عودة العنوان وما الي دالك

لكن السؤال لمحيرني

هو هل هده العنواين هي نفسها عناوين الثغرات مثلا في

buffer over flow

عندما يحدث الفيض

في البفر اليا سنكتب فوق عنوان العودة

بعنوان الشل كود الخاص بنا ومن هنا ستكون الانطلاقة وبداية الشل كود

هل هدا التفسير هو مايحدث هنا ام لا

كبعا في هدا الكود

L14 :call L15
L15 : pop eax

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

user32.dll

kernel32.dll

وغيرها

ارجووووووووووووكم حد يفهما هده اللخبطة

وشكرا

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#8

لم افهم صراحة :wacko:

انصحك ان تعيد قراءة بعض الدروس عن الموضوع ، ايضا حاول استخدام اسماء المصطلحات بدقّة اكثر .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#9

حولت التعبير قدر الامكان بما استطيع من العربية

لمشكلتي والظاهر احنا الجزائرين عندنا مشكل في العربية

المهم

ساحاول البحث عن الموضوع

وادا وجدت اي مشاكل ساطرحها في نفس هدا الموضوع او في موضوع مستقل

شكرا

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#10
اقتباس
حولت التعبير قدر الامكان بما استطيع من العربية

لمشكلتي والظاهر احنا الجزائرين عندنا مشكل في العربية

؟؟

وما هى اللغة التى تتعاملون بها فى الجزائر ؟

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#11

الفرنسية

خصوصا المغتربين مثلنا

تعلمنا العربية باجتهادنا فقط

!!!!!!!!!!!!!!!

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#12

مصيبة

هل هناك جزائريين لا يعرفون العربية؟!!

انا اول مرة اسمع هذا الكلام

بخصوص سؤالك انا متأسف فأنا لست كراكر ليس لى فى موضوع الثغرات

ولغته مفهومة لكن ما تقصده هو الغير مفهوم

موقع البرنامج

مبارك لشعب تونس photo-thumb-42837.png

#13

اخي

حريف برمجة

انا اقصد المغتربين

انا اعرف اناس حتي الفاتحة لا يعرف يقراها جيدا

اما عن الجزائرين المقيمن في الوطن فطبعا يتكلمون العربية

بالاظافة للغة الفرنسية لانها لغة رسمية

المعدرة للحروج عن الموضوع

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#14

السلام عليكم

اخوتي

حريف البرمجة

و

gamingmaster

بعد بحث في النت

وجد اخير جواب لتساؤلاتي وحبيت اشارك بها الاخوة

الامر كله يتعلق بتقسيم ملفات

.EXE

او ما يعرف اصطلاحا ب

PE

ولنكون اكثر دقة الامر يتعلق ب

The Import Table

وهو من اقسام

PE

طبعا ادا اسقطنا الفائدة من

Import Table

علي كتابتنا للشيل كود

نري باننا بحاجة اليه من اجل استيراد دوال لكي نكتب شيل كود مفيد فيه خواص تحكم مفيدة

فمثلا لو اردنا التعليمة التالية

FUNC()

الموجودة في

user32.dll

فنكتب كما يلي

L14 : call [L15]
L15 : jmp dword ptr ds:[L20]

حيث ان التعليمة

jmp dword ptr ds:[L20]

تعني القفز الي عنوان التعليمة

FUNC()

الموجودة في

user32.dll

ملاحظة

الامر ليس بهده البساطة طبعا وما شرحته هو ما فهمته من المقالة .

والامر يتعلقة بامور اعقد من دالك

مثلا معرفة عناوين المكاتب مثل

user32.dll,kernel32.dll

وارجو من الاخوة تصحيح ادا ماكان هنالك احطاء

شككككككككككككرا

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#15

توجد أكثر من طريقة للوصول إلي عناوين الدوال

البداية تكون من إتيان عنوان Kernel32

والمعظم يفضل الاستعانة ببنية PEB لإنها علي ما أتذكر الأقل حجما بين جميع الطرق

mov eax,fs:[30h]					; eax = PEB base
mov eax,[eax+0ch]		; eax = *Process Module info 
mov eax ,[eax+1ch]		; eax=  *first entry in module list
mov eax,[eax]			; get the value from the address
mov ebx,[eax+08h]		; ebx = kernel32 base address

وعند الوصول لعنوان Kernel32 يمكنك قراءته كما تقرأ صيغة ملف PE بصورة عادية جداا .. وتصل إلي جدول العناوين المصدرة EAT بالمكتبة

ومن ثم تحصل علي العناوين التي تريدها عن طريق مقارنة اسماء الدوال مثلا .. ويمكنك الاستعانة بعنواني LoadLibrary و GetProcAddress داخل المكتبة Kernel32 للوصول إلي عنوان أي وظيفة داخل مكتبة DLL واستخدامها.

تم تعديل هذه المشاركة بواسطة Muhammad Fayed في 3 يونيو 2009 في 21:09

#16

شكرا

اخي

محمد الفايد علي الاظافة الجميلة

وكما قلت توجد طرق عدة لايجاد العناوين منها مكا دكرت

BEF process envirment  block
 SEH estructured exaption handling
 TOPSTACK

بنسبة للحجم

bef >>>>> 43 bytes

seh>>>>> 33 bytes

topstack>>> 25 bytes

تم تعديل هذه المشاركة بواسطة aziz nor في 3 يونيو 2009 في 21:29

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#17

43 بايت حجم كبير جداا علي 5 تعليمات أولية

64 A1 30 00 00 00 
8B 40 0C
8B 40 1C
8B 00
8B 58 08

إذا قمت بإدراجهم في OLLY ستجد الحجم تقريبا 17 بايت .. لكن يبقي حجم جسم الشيل كود نفسه

بأي حال وبـ Good Optimization لن يزيد طوله عن 70 بايت

تم تعديل هذه المشاركة بواسطة Muhammad Fayed في 3 يونيو 2009 في 22:10

#18

الكود الدي عندي ويعمل حسب

BEF

يختلف قليلا عن الدي عندك

هدا هو

find_kernel32:
push esi
xor eax, eax
mov eax, fs:[eax+0x30]
test eax, eax
js find_kernel32_9x
find_kernel32_nt:
mov eax, [eax + 0x0c]
mov esi, [eax + 0x1c]
lodsd
mov eax, [eax + 0x8]
jmp find_kernel32_finished
find_kernel32_9x:
mov eax, [eax + 0x34]
lea eax, [eax + 0x7c]
mov eax, [eax + 0x3c]
find_kernel32_finished:
pop esi
ret

طبعا هو ل

95/98/ME/NT/2K/XP

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#19

Viva La NT

#20

اخ محمود

هل عندك مراجع

في برمجة الشل كود في الوندوز

لانها شحيحة نوعا ما عكس ماهي في اللينكس

ملفاتت او مواقع متخصصة

شكرا علي التفاعل

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

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