Shellcode نویسی در دلفی – قسمت دوم

با سلام.

قسمت دوم از سری آموزش شلکد نویسی در دلفی رو در خدمتتون هستم.

Shellcode_Logo

نحوه استفاده از شلکد ها 

شلکد ها معمولا به صورت آرایه ای از بایت ها برای استفاده قرار داده می شوند.به عنوان مثال :

و برای اجرای این قطعه شلکد:

 

مثال:

در اینترنت منابع بسیاری را می توانید جهت تست و یادگیری استفاده کنید. یکی از بهترین منابع استفاده از سایت www.exploit-db.com هست.

اکثر شلکد ها به صورت آرایه در زبان C قرار داده شده اند. می تونین با یه ویرایشگر متن مثله Notepad++ به راحتی یه Replace انجام بدین و ‘\X’ رو به ‘,$” تبدیل کنید.

مثال رو از سایت Exploit-db.com براتون میزارم:

 

این شلکد یک پیام را نمایش می دهد و سپس برنامه را می بندد.

Shellcode_Exe

استفاده از امکانات دیباگ دلفی

امکاناتی که دلفی برای دیباگ در اختیار ما قرار می دهد بسیار راه گشا و قابل استفاده است.

Alt+Ctrl+C : هنگامی که یک Breakpoint در خطی از برنامه قرار می دهیم و مایل به دیدن کد اسمبلی معادل و آدرس اجرای دستور در حافظه هستیم ، از این کلید ترکیبی استفاده می کنیم.

به عنوان مثال در برنامه قبل مایلیم شلکد را ورای ارایه ای از بایتها به صورت کد های اسمبلی ببینیم. بر روی دستور Call یک Breakpoint گداشته ، و هنگام توقف دلفی بر روی دستور از دکمه میانبر ترکیبی استفاده می کنیم:

Shellcode_BRP

 

 

برای دیباگ کد از کلیدهای میانبر استفاده می کنیم. به عنوان مثال برای Single Stepping از کلید F8 استفاده می کنیم. سایر میانبرها همانند OllyDBG می باشد.

دکمه F7 را زده و وارد CALL می شویم و کدهای شلکد که به صورت اسمبلی درآمده اند قابل دیدن است:

ShellCode_DisAss

در این قسمت آدرس شروع شلکد در حافظه نیز قابل دیدن است. با این آدرس و استفاده از امکانات OllyDBG خالی از لطف نیست و برای بررسی شلکدهایی که به سورس دسترسی نیست راهگشاست.

قوائد نوشتن شلکد در دلفی

در این قسمت یکسری از اصول را در دلفی برای شلکدنویسی ذکر می کنیم.

– از انواع متغییرهای زیر به صورت مستقیم می توانیم در شلکد خود استفاده کنیم:

Integer , DWORD , Byte , Pointer , و… و  اشارهگرهای به این نوع ها.

– از عبارات محاسباتی می توان بر روی انواع بالا استفاده کرد.

-از هرگونه عملیاتی که ارجاعی مستقیم به قسمتی از حافظه باشد نمی توان استفاده کرد از جمله:

*از متغیرهای رشته معمولی دلفی (نوع String) نمی توان استفاده کرد.

*از کلیه توابع دلفی که در یونیت های دیگر تعریف شده اند نمی توان استفاده کرد.

*از کلیه توابع API ویندوز که در دلفی تعریف شده است به صورت معمول نمی توان استفاده کرد.

** دلیل موارد منع بالا بسیار واضح می باشد. آدرس های حافظه با توجه پارامترهای مختلف ، متفاوت می باشد. پس بر روی سیستم دیگری درست کار نخواهد کرد. به عنوان مثال شما در شلکد خود به صورت مستقیم از API مسیج باکس (MessageBoxA) استفاده می کنید. آدرس این تابع در ویندوزهای با ورژن های مختلف متفاوت است. راه حل استفاده از روتینی در شلکد می باشد که در هر سیستمی آدرس هر API را به صورت پویا به دست آورد.

برای روشتن تر شدن مطلب ، سورس زیر را ببینید:

 

بر روی تابع Sleep بریکپوینت گذاشته و دیباگ می کنیم:

Shell_Sleepهمان گونه که پیداست آدرس تابع Sleep به صورت مستقیم مورد استفاده قرار گرفته و اگر سورس را در سیستم خود کامپایل کنید به آدرس متفاوتی می رسید. پس بدیهی است این فراخوانی برای شلکد اشتباه است.

 پایان قسمت دوم

در این قسمت به تعدادی از مقدمات شلکد نویسی در دلفی اشاره کردیم و تا جای ممکن با مثال این موارد توضیح داده شد. برای تمرین دوستان بهتر است شروع به کد نویسی و دیباگ کدهای خود کرده و گوشه چشمی به نکات بالا داشته باشند. همچنین مهارت های کار با pointer ها را اندکی تقویت کرده.

قسمت سوم

در قسمت بعد نوشتن شلکد رو به صورت عملی شروع می کنیم و به بیان تکنیک های استفاده از توابع API، به کارگیری String ، توابع تودرتو و … خواهیم پرداخت. قسمت آینده با تفاوت هایی ارایه خواهد شد ، که به منفعت نگارنده و افراد علاقه مند RCE خواهد بود . جزییات بیشتر با آماده شدن قسمت آینده ذکر خواهد شد.

مشتاقانه  منتظر نظرات و سوالات تون هستم… حتی اگه همه ی  مطالب بالا رو مبهم می دونید!

 

SadeghPM

SadeghPM is one one must great in developing and RCE wold.

More Posts

2 thoughts on “Shellcode نویسی در دلفی – قسمت دوم”

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *