Shellcode نویسی در لینوکس بخش 3

به نام دانای بر حق

پیرو آموزش های بخش اول و دوم shell code نویسی در لینوکس یه خرده از بحث مبتدی خارج شده و کمی تولید علم در زبان پارسی در این مورد می کنیم نظر به این نکته که شل کد ها معمولا کد ماشین هستند ما کمی از مباحث پایه خارج میشویم و در این مورد بیشتر بحث می کنیم ، البته اگر خسته نشید : )

 

کمی در مورد ساختار سخت افزار ، زبان ماشین و اسمبلی

ابتدا من از سخت افزار و ساختار cpu به طور مختصر و مفید بگم،هم ما فک میکنیم CPU زبون نفهم هست هم CPU بلا نسبت شخص شخیص شما همچین فکری میکنه 😀 به تصویر زیر توجه کنید:

 

chart cpu

خب این رابطه معادله مثل ترازو هست مشخص هستش که هر چی بیشتر زبان برای ما خوش آیند تر میشه برای پردازنده  نا خوشایند میشود و همین نسبت عکسش هم برقرار هستش خب بهترین حالت شلکد نوشته شدن در پایین ترین قسمت تصویر بالا هستش و حالا یه خرده بیشتر در مورد CPU  یا همون پردازنده صحبت کنیم تا برسیم به اصل داستان:

درباره پردازنده و ثبات ها

موضوعی رو که الان دارم بیان می کنم شاید خودم تو ۱۰۰ تا مقاله خونده باشم، تو ۱۰ تای اول فحش دادم سرسری رد شدم گفتم شما هم گریه ما رو در آوردید اینقدر گفتید این موضوع رو و میگفتم اگر خودم یه روزی کتابی مقاله ای بنویسم اینو نمیگم ولی اینقدر اهمیتش زیاده کهع من هم مجبور هم بگم ولی به زبان ساده کاربردی میگم از نظر آکادمیک ثبات ها یا همون ریجستر ها به دو قسمت تقسیم میشم ولی من دو دسته اش میکنم: ( x86 – 32bit)

  1. کاربردی اونایی که دسترسی مستقیم برنامه نویس داره: EAX, EBX, ECX, EDX, ESI, EDI
  2. غیر کاربردی اونایی که خوده پزدازنده بهش دسترسی داره شما فقط در دیباگر میتونین تماشاش کنید: ESP, EIP, EBP , …

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

EAX Accumulator Register همه منظوره ترین ثبات است و معمولا برای هر کاری از جمله عملیات ورودی/خروجی،رشته ای و محاسباتی به کار می رود از 3 جزء AX, AH, AL تشکیل شده است که بیشتر توضیح میدم
EBX Base Register تنها ثباتی که می تواند بعنوان ایندکس در آدرس دهی مورد استفاده قرار می گیرد. شامل 3 قسمتBX BL و BH است
ECX Count Register بعنوان شمارنده در کنترل تعداد دفعات تکرار در دستور حلقه استفاده می شود. دارای 3 قسمتCX CL و CH است
EDX Data Register در اعمال ورودی/خروجی و عملیات ضرب و تقسیم استفاده می شود. دارای 3 بخشDX DL و DH است

و ثابت های ایندکس:

ESI Source Index برای آدرس دهی و در عملیات رشته ای بعنوان مبدا استفاه می شود
EDI Destination Index برای آدرس دهی و در عملیات رشته ای بعنوان مقصد استفاه می شود

 

خب برای این تقسیم بندی ها به شکل زیر توجه کنید:

intel-regsحالا توضیح مختصر ثبات ۳۲ بیت جا داره و کل 32 بیت میشه EAX مثلا و 16 بیت سمت راست میشه AX مثلا و 8 بیت راست میشه AL  و 8بیت سمت چپ همین AL میشه AH به تصویر زیر دقت کنید:

redefined_registers

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

 

نوشتن شل کد در بخش نهایی

خب پس ما باید شلکد رو باید به زبان ماشین بنویسم طبق آنچه در بالا به رنگ بنفش نوشتیم، مراجعه کنیم به این قسمت خب ما فرض رو میگیریم کد ماشین تولید شده میخوایم اون رو کد نویسی کنیم نیاز مند به gcc دارم حتما روی لینوکس شما هست نگردید دنبالش:

شل کد شما مثلا یک کد hex این شکلی هستش:

که در کد بالا باید جای Insert your shellcode here قرار دهید پس بعد طبق آموزش 1 همین بخش کامپایل و اجرا کنیم.

 

این قسمت برای این که طولانی شد بقیه ماجرا که میشه کد نویسی و بهینه سازی یک شل کده فوق العاده ساده رو با هم پیش میریم پس در آموزش بخش 4 منتظرتون هستیم.

‌A1Gard

اول از همه کوچک ترین عضو مجموعه 4xmen بنده حقیر هستم. در ثانی یک توسعه دهنده هستم زمینه های تخصصی کارم :‌ Delphi, PHP, C++ ,Python, JavaScript, Unity game engine, C#, asm و علاقه مند به لینوکس، RCE ، کریپتوگرافی هستم. تا الان حضرت حق اینا رو به ما داده و هر وقت که بخواد ازمون میگیره دست خودشه. یا حق، با حق، تا حق

More Posts

پاسخ دهید

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