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

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

با سلام.

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

Shellcode_Logo

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

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

ShellCode:array[0..2] of byte = ($55, $8b, $ec)

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

	Asm
		Call ShellCode
	end

 

مثال:

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

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

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

 

program Shellcode;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

Const
  ShellcodeArr:array[0..112] of byte=(
$۳۱,$d2,$b2,$30,$64,$8b,$12,$8b,$52,$0c,$8b,$52,$1c,$8b,$42
,$۰۸,$۸b,$72,$20,$8b,$12,$80,$7e,$0c,$33,$75,$f2,$89,$c7,$03
,$۷۸,$۳c,$8b,$57,$78,$01,$c2,$8b,$7a,$20,$01,$c7,$31,$ed,$8b
,$۳۴,$af,$01,$c6,$45,$81,$3e,$46,$61,$74,$61,$75,$f2,$81,$7e
,$۰۸,$۴۵,$۷۸,$۶۹,$۷۴,$۷۵,$e9,$8b,$7a,$24,$01,$c7,$66,$8b,$2c
,$۶f,$8b,$7a,$1c,$01,$c7,$8b,$7c,$af,$fc,$01,$c7,$68,$79,$74
,$۶۵,$۰۱,$۶۸,$۶b,$65,$6e,$42,$68,$20,$42,$72,$6f,$89,$e1,$fe
,$۴۹,$0b,$31,$c0,$51,$50,$ff,$d7);

begin

asm
  call ShellcodeArr
end;

end.

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

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

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

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

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

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

program Shellcode;

uses Windows;

Procedure xSleep;
begin
  Sleep(10);
end;

begin

xSleep;
end.

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

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

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

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

قسمت سوم

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

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

 


انتشار

در

,

توسط

برچسب‌ها:

نظرات

2 پاسخ به “Shellcode نویسی در دلفی – قسمت دوم”
  1. رامان

    با تشکر از اساتید محترم.

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

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